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

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

Fernando Iury Alves Costa
fernandoiury

(usa Red Hat)

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á =)


  


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

Gabriel
m4sk4r4

(usa Manjaro Linux)

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)..

Perfil removido
removido

(usa Nenhuma)

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)..

Tiago Barcellos Peczenyj
pacman

(usa Ubuntu)

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...

Diego J. Hoss
piazinhodolinux

(usa Suse)

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)..

Eduardo Silva
eduvfsilva

(usa Ubuntu)

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)..

Helder
HelderC

(usa Ubuntu)

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

Cristiano
cristianoltfs

(usa Linux Mint)

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

Lucas Lira Gomes
llg

(usa Arch Linux)

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

Juliano Giacomeli
julianjedi

(usa Arch Linux)

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)..

Andre Gerson Ganske
AndreGanske

(usa Ubuntu)

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

Lucas Lira Gomes
llg

(usa Arch Linux)

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



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts