Jump to content
Fórum Script Brasil
  • 0

leitura de matriz de strings entre inteiros


gabrieldestro

Question

Olá a todos,

Estou tendo problema na leitura dos valores do meu código. Primeiro eu leio 5 inteiros, depois uma matriz de caracteres, um vetor de inteiros e por fim mais uma matriz de caracteres. Aparentemente o programa não está lendo o vetor de inteiros, mas provavelmente um \n ou alguma coisa assim no buffer de entrada.

A minha suposição está correta? Como posso limpar o buffer de forma que ele leia o vetor? Já tentei de varias maneiras, mas nada deu certo.

#include <stdio.h>

int main() {
        
    int nPosicoes, maxCaixas;
    int nProgramas, maxComandos;
    int nExecucoes;
    int programaNumero [60];
    char programa [9] [61];
    char posicao [10] [11]; 
    int i;
    scanf("%d", &nPosicoes);
    scanf("%d", &maxCaixas);
    scanf("%d", &nProgramas);
    scanf("%d", &maxComandos);
    scanf("%d", &nExecucoes);
    
  
    for (i = 0; i < maxCaixas; i++) {
        scanf("%s", posicao[i]);
    }
    
    for (i = 0; i < nExecucoes; i++) {
        scanf("%d", &programaNumero[i]);
    }
    
    for (i = 0; i < nProgramas; i++) {
        scanf("%s", programa[i]);
    }

Não sei se isso serve de alguma coisa, mas programo em linux.

obrigado.

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Olá!

Olha, não vou mentir para você comecei a estudar C a pouco tempo e vetores e matrizes a cerca de dois dias, então acho que não vou ser muito util.

Como não sei exatamente o que o seu programa deve fazer, não compreendi muito bem a sua sintaxe, mas ao que parece aparentemente, todos os valores estão sendo gravados, não sei se corretamente mas estão.

Com relação ao buffer de entrada do teclado no linux, você pode tentar usar a função __fpurge(stdin); apos cada scanf() para a limpeza do buffer de entrada do teclado, existem outros metodos que você pode tentar procurar mais tarde para a limpeza de buffer!

Com relação ao codigo que você postou, acho que não deve ser todo o codigo que você fez, mas de qualquer forma tente usar um printf para exibir as informacoes que deveriam ser gravadas e mostradas na tela, como não sei como o seu codigo deve realmente fazer, nesse ponto um printf faz uma falta danada!

Bem só posso ir ate aqui....

Espero ter Ajudado!

Edited by Felipe-Petrópolis
Link to comment
Share on other sites

  • 0

En vez de limpar você pode ir tomando precauçao para que não entre \n al buffer:


#include <stdio.h>

int main() {

int nPosicoes, maxCaixas;
int nProgramas, maxComandos;
int nExecucoes;
int programaNumero [60];
char programa [9] [61];
char posicao [10] [11];
int i;
scanf ( "%d%*c", &nPosicoes );
scanf ( "%d%*c", &maxCaixas );
scanf ( "%d%*c", &nProgramas );
scanf ( "%d%*c", &maxComandos );
scanf ( "%d%*c", &nExecucoes );


for ( i = 0; i < maxCaixas; i++ ) {
scanf ( "%[^\n]%*c", posicao[i] );
}

for ( i = 0; i < nExecucoes; i++ ) {
scanf ( "%d%*c", &programaNumero[i] );
}

for ( i = 0; i < nProgramas; i++ ) {
scanf ( "%[^\n]%*c", programa[i] );
}


getchar();
return 0;
}

O especificador %[^\n] le até encontrar \n, ignorando espaços tabuladores etc, ou seja que você pode ler "Hola Mundo" e ele vai guardar ambos Hola e mundo em um só string, coisa que você não pode fazer com um scanf normal já que scanf le só até encontrar um espaço, um tabulador ou o caracter enter(\n).
Por outro lado %*c ignora o ultimo char não permitindo ele entrar ao buffer. então %[^\n]%*c le tudo menos o \n que é o ultimo char que você pulsa (\n tambem é um char) ;).
Para simples inteiros %d por só %*c atraz de forma que fique %*d%*c(le um int e ignora o ultimo char que é o enter que você pulsa logo en seguida). Tambem funciona com %c%*c.

Outra forma magica de evitar o enter é ponendo un espaço antes do"%c" de forma que fique" %c" dentro do scanf, ou seja scanf(" %c", letra); ou scanf(" %s", frase); //Note o espaço antes do %c e do %s. Un exemplo:


#include <stdio.h>

int main() {

int n;
char c1;
printf("Entre um int: ");
scanf("%d", &n);

printf("Agora um char: ");
scanf(" %c", &c1);//entre " e %c tem um espaço que ignora o anterior enter fazendo que funcione correctamente. Si tirar o espaço falha a leitura do char por causa do \n ao ler o int

printf("Apesar de ter \n no buffer se imprime normalmente: %c", c1);

getchar();
return 0;
}

Existe muitas formas de fazer.

Sorte!

Edited by vangodp
Link to comment
Share on other sites

  • 0

Obrigado a ajuda de todos, mas na verdade o problema nem era no buffer, era uma coisa mais estúpida que isso.

for ( i = 0; i < nExecucoes; i++ ) {
scanf ( "%d", &programaNumero[i] );
}

essa parte deveria ler uma linha de caracteres como:

2121235326262

Obviamente eu não poderia ler isso como inteiro, como eu estava tentando fazer. Hahahaha

Obrigado a ajuda de todos!

Link to comment
Share on other sites

  • 0

E por que não? Acho que você se esta enrolando muito, e já to começando a me enrolar eu também. :D

É claro que você pode ler inteiros com:

for ( i = 0; i < nExecucoes; i++ ) {
scanf ( "%d", &programaNumero[i] );
}

Qual é o problema?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...