Ir para conteúdo
Fórum Script Brasil
  • 0

leitura de matriz de strings entre inteiros


gabrieldestro

Pergunta

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 para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 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!

Editado por Felipe-Petrópolis
Link para o comentário
Compartilhar em outros 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!

Editado por vangodp
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...