Pular para o conteúdo

problema ao ler um char após um ler inteiro (usando scanf)..

Responder tópico
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
  • Denunciar
  • Indicar
01 02

1. problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 21/12/2005 - 19:23h

fala galera, eu dinovo!

po é o seguinte: já fiz vários testes mas não consigo ler um inteiro e depois um char com o scanf.

ex:
----
printf("digite o primeiro inteiro");
scanf("%d",&int1);

printf("digite um char");
scanf("%c",&char);

printf("digite o segundo inteiro");
scanf("%d",&int2);
----

ele da o seguinte layout:
digite o primeiro inteiro: /* aqui ele para e espera eu digitar o inteiro*/
Digite um char:/*nao para, pula essa parte direto*/
Digite o segundo inteiro: /*aqui ele espera eu digitar o segundo inteiro*/


alguem sabe me dizer porque ele pula a linha que iria ler o char ? (le o primeiro int e pula pra ler logo o segundo)


obs: a declaração das variáveis e o resto ta correto pois quando testo separado tudo funciona!

vlw desde já =)

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

2. Re: problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 21/12/2005 - 21:08h

Olá,

Passei por este problema també, há solução que encontrei foi colocar um getchar(); depois do scanf(), assim resolvir o problema de ficar pulando .

Não sei porque ocorre isto, mais deve ser algo que fica armazenado no buffer do teclado, quando usa a função scanf(), sendo assim, passando o lixo para próxima função.

t+
M4sk4r4

3. Re: problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 22/12/2005 - 12:16h

o problema eh q o '\n'(enter) que vc digita após o inteiro fica no buffer da stdin e qdo vc chama um scanf logo após, ele pega esse '\n'...
a solucao mais logica pra corrgir isso eh fazer um
"fflush(stdin);" após os scanfs para limpar a entrada padrão.

4. Re: problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 22/12/2005 - 14:27h

Tenta assim:

printf("digite o primeiro inteiro");
scanf("%d\n",&int1);

printf("digite um char");
scanf("%c\n",&char);

printf("digite o segundo inteiro");
scanf("%d\n",&int2);

5. talvez...

Enviado em 24/12/2005 - 13:11h

printf("digite o primeiro inteiro");
scanf("%d",&int1);

fflush(stdin); //isso talvez resolvera

printf("digite um char");
scanf("%c",&char1);

printf("digite o segundo inteiro");
scanf("%d",&int2);

ai irmão...
testei o prog, e colocando um "fflush(stdin)" resolveu, a função do fflush, é para limpar o buffer do teclado, sempre que vc for receber uma variavel do tipo char, é aconselhavel usar o fflush!
espero q tenha cotribuindo...
Valeu!!!

6. Re: problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 02/06/2009 - 02:22h

Então, nenhuma das soluções apontadas até aqui (fflush, \n depois do %*, getchar()) funcionou, tentei ainda esta:

scanf("%2c", &ch);

mas também não funcionou. Me restou essa:

scanf("\n%c", &ch);

E "deu beleza"!
Valeu aí pela ajuda e vamo que vamo!

7. Re: problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 02/06/2009 - 14:06h

O char é uma palavra reservada.
Você não pode usá-la para dar nome a uma variável.

[]s

8. Leitura de char após ler um char com scanf

Enviado em 19/07/2010 - 11:26h

Estava com o mesmo problema, após ler o nome passava direto pelo sobrenome e pedia para digitar o salário.

Olha o que eu fiz que deu certo.

...
char turno, categoria, sobrenome[51], pnome[51];
printf("\nDigite o primeiro nome do funcionário: ");
scanf("%s",pnome); //%s armazena cadeia de caracteres sem espaço em branco
printf("\nDigite o sobrenome completo do funcionário: ");
scanf("\n%[^\n]s",sobrenome); //Armazena cadeia de caracteres inclusive com espaço em branco até ser precionada tecla enter, limpa o conteúdo digitado anteriormente (limpa a string)
printf("Digite o valor do salário mínimo: ");
scanf("%f",&salmin);
...

Sou novato no mundo de programação em c. Estou aprendendo a programar em c no linux. Qualquer erro por favor corrijam. Não entendi o que foi feito, alguém poderia me explicar.

Valeu pessoal. Até mais.

9. Resposta

Enviado em 21/07/2010 - 12:34h

E isso ai pessoal, C nao foi uma linguagem feita para se ter uma interface direta com o usuario pelo terminal. O proprio scanf(), se voces derem uma pesquisada pela net, e conhecido por ter varios bugs (como deixar lixo no buffer de entrada) e ser pouco confiavel, mais bem vamos a algumas opinioes:

Sobre o fflush(stdin): Essa funcao nao e recomendada pelo, padrao ANSI C, para limpar o buffer de saida, porque o comportamento e indefinido. Se ela funciona com algum de voces, provavelmente se deve a alguma gambiarra do compilador. o fpurge(stdin) tambem tem um comportamento semelhante e tambem nao e recomendada. Se voces se importam com portabilidade, nao as usem com o buffer de entrada.

Sobre scanf("\n%[^\n]s",sobrenome): Faz o que promete, e tem um comportamento identico ao de gets(). Mas elas possuem um limitante, nao verificam o tamanho da string e podem tentar colocar 60 chars onde se poderia colocar apenas 10, por isso usem fgets(variavel, tamanho do buffer, stdin) no lugar das duas, pois o fgets garante que o buffer nao sera excedido, evitando assim bugs com comportamento indefinido XD.

Recomendo fortemente que se for possivel e voces tiverem certeza sobre a corretude das entradas, que facam uso de arquivos ao inves de entrar com dados pelo terminal!!! XD

Ha tambem esse artigo em ingles que recomendo que leiam, ele explica melhor algumas coisas que falei.
"Coisas para se evitar em C/C++" : http://www.gidnetwork.com/b-56.html

Espero ter ajudado, Lucas Lira Gomes

P.S.: Desculpem pela falta de acentuacoes, mais o teclado aqui e americano XD.

10. Uma dica simples

Enviado em 21/07/2010 - 21:08h

Parece estranho mas não é tanto, simplesmente coloque um espaço antes do %c com isso todo o buffer anterior é ignorado

int int1, int2;
char char1;

printf("digite o primeiro inteiro");
scanf("%d",&int1);

printf("digite um char");
scanf(" %c",&char1); //veja que tem um espaço antes do %c

printf("digite o segundo inteiro");
scanf("%d",&int2);

Detalhe:
Como nosso colega HelderC disse

O char é uma palavra reservada.
Você não pode usá-la para dar nome a uma variável.

11. problema ao ler um char após um ler inteiro (usando scanf)..

Enviado em 31/07/2010 - 14:34h

Opa!

Também tive muitos problemas com isso, e um amigo me recomendou o uso de:

gets (stdin);

Entre o int e o char, dessa forma não tive mais problemas.
A única coisa que acontesse, é que quando compilo, o gcc retorna a seguinte mensagem:
"warning: the `gets' function is dangerous and should not be used."
Apesar disso nao tenho mais problemas com buffer de teclado.

Abraço

12. Resposa

Enviado em 31/07/2010 - 17:25h

@AndreGanske : O gcc avisa isso por causa do que citei ali em cima, o gets não verifica o tamanho do buffer e pode tentar exceder o tamanho máximo da string, gerando um comportamento indeterminado pois não se sabe que informação da memória sera sobescrita.

Atenciosamente, Lucas Lira Gomes
01 02

Responder tópico

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Responder tópico

Entre na sua conta para responder.

Fazer login para responder