Introdução à Linguagem C – Tutorial II
Uma tarefa simples em outras linguagens, mas em C, é bem confusa, é quando você tenta armazenar em uma variável, uma string que contenha espaços em branco.
Exemplo 1:
#include
1 2 3 |
<<span class="start-tag">stdio.h</span>> <strong><span style="color: #008000;">int</span></strong> main(){ <strong><span style="color: #008000;">char</span></strong> nome[ |
20
1 2 3 |
]; printf( |
“Entre com seu nome\n“
1 |
); |
// se você digitar seu nome completo, terá problemas
1 |
scanf( |
“%s“
1 |
,nome); |
// na variável “nome” será armazenada apenas a primeira// palavra digitada.
1 |
printf( |
“Seu nome é: %s \n“
1 |
,nome); return(0);} |
No exemplo acima, o programa solicita um nome. Se você digita uma string composta, no caso, seu nome completo, a função scanf() irá desprezar todo o conteúdo a partir do espaço. Desta forma, na variável nome conterá apenas o primeiro nome digitado.
Uma outra alternativa poderia ser a função gets(). É, poderia… mas gets() não é uma boa alternativa.
Com a função gets() não há limites, o usuário poderá digitar mais caracteres do que o que foi definido no array, na declaração da variável.
Exemplo 2:
#include
1 2 3 |
<<span class="start-tag">stdio.h</span>> <strong><span style="color: #008000;">int</span></strong> main(){ |
// nos [] você define o número máximo de caracteres char
1 |
nome[ |
20
1 2 3 |
]; printf( |
“Entre com seu nome\n“
1 |
); |
// se o usuário digitar mais que 20 caracteres, haverá um erro
1 |
gets(nome); |
// na variável “nome”, foi armazenado apenas a primeira palavra
1 |
printf( |
“Seu nome é: %s \n“
1 |
,nome); return(0);} |
A melhor forma então, utilizar a função fgets():
Exemplo 3:
#include
1 2 3 |
<<span class="start-tag">stdio.h</span>> <strong><span style="color: #008000;">int</span></strong> main(){ <strong><span style="color: #008000;">char</span></strong> nome[ |
20
1 2 3 |
]; printf( |
“Entre com seu nome\n“
1 |
); |
// fgets() tem a mesma funcionalidade de gets()
1 |
fgets(nome,20,stdin); |
// na variável “nome”, foi armazenado a frase completa
1 |
printf( |
“Seu nome é: %s \n“
1 |
,nome); return(0);} |
Ainda haverá um problema, caso exista um scanf() antes do fgets():
Exemplo 4:
#include
1 2 3 |
<<span class="start-tag">stdio.h</span>> <strong><span style="color: #008000;">int</span></strong> main(){ <strong><span style="color: #008000;">char</span></strong> nome[ |
20
1 2 3 |
]; <strong><span style="color: #008000;">int</span></strong> idade; printf( |
“Digite sua idade\n“
1 |
); scanf( |
“%d“
1 2 3 |
,&idade); printf( |
“\nEntre com seu nome\n“
1 |
); |
// aqui não será solicitada uma entrada de dados
1 2 3 |
fgets(nome,20,stdin); printf( |
“Seu nome é: %s \n“
1 |
,nome); return(0);} |
Neste exemplo, o fgets() nem solicitará uma entrada, isto porque, ele pega o ‘\n’ do ENTER, que foi usado para inserir dados com o scanf(). É necessário então, limpar o buffer de entrada.
No próximo exemplo, a solução:
Exemplo 5:
#include
1 2 3 |
<<span class="start-tag">stdio.h</span>> <strong><span style="color: #008000;">int</span></strong> main(){ <strong><span style="color: #008000;">char</span></strong> nome[ |
20
1 2 3 |
]; <strong><span style="color: #008000;">int</span></strong> idade; printf( |
“Digite sua idade\n“
1 |
); |
// o scanf ler o conteúdo digitado, depois, o parâmetro *c,// faz com que seja retirado os demais caracteres.
1 |
scanf( |
“%d%*c“
1 2 3 |
,&idade); printf( |
“\nEntre com seu nome\n”
1 |
); |
// agora, tudo perfeito
1 |
fgets(nome,20,stdin); |
// “nome” armazenou apenas a frase digitada
1 |
printf( |
“Seu nome é: %s \n“
1 |
,nome); return(0);} |
Para aprender como compilar arquivos .c no Linux, leia a dica Compilando arquivos .c no Linux.
The end!
Olá.
A diferença entre o gets e o fgets não é só essa.
Pois quando você inclui uma string com tamanho menor que o máximo, no fgets, sua variável recebe o caracter ”
” no final em qualquer posição de sua string quando você termina de digitar.
Como posso resolver isso? Como retirar esse ”
” do final de minha string?
Olá Daniel,
A resposta para sua pergunta está no exemplo5: *c.
Muito obrigado! Eu simplesmente não entendia por que o compilador gcc para windows compilava mas não rodava direito o programa com o fgets.
já procuro a solução há algum tempo até cair aqui. A solução deste blog vestiu como uma luva para meu caso de código híbrido (scanf e fgets).
Mais uma vez muito obrigado!