Porém, lá tratamos só de números (tanto inteiros, como decimais). Mas, muitas vezes, nós precisamos digitar textos em programas.
Por isso vamos aprender como receber letras do usuário.
Vamos explicar o que são e como funcionam as funções scanf, getchar e fflush.
- Baixar nossa apostila: Apostila de C
Recebendo caracteres em C através da função scanf()
Mas com os caracteres, ao invés de usar %d (para números inteiros0 ou %f (para números floats), vamos usar %c.
Pois é assim que representamos variáveis do tipo char em C.
Portanto, um programa que pede um caractere ao usuário e o imprime na tela é feito da seguinte maneira:
#include <stdio.h> int main() { char letra; printf("Insira um caractere: "); scanf("%c",&letra); printf("Você digitou: '%c'", letra); }
Recebendo caracteres em C através da função getchar()
Com ela, podemos pegar uma infinidade de dados do usuário, e inclusive escolher o que vai ser 'capturado', limitar o tanto de coisas que pode ser escrito, e uma série de outras funcionalidades que vocês irão aprender durante nosso curso de C.
Porém, há mais opções que facilitam nossa vida.
Existe uma função que faz o mesmo papel da scanf e é voltada para o uso com caracteres, é a getchar().
Ela é mais simples, pois não precisar usar %c ou &, como fazemos na scanf(), e foi feito especialmente para ser usado com caracteres.
get -> pegar
char -> caractere
Para usar, fazemos:
seu_caractere = getchar();
Veja como é seu uso em um código que pede um caractere para o usuário, armazena no char 'letra', e em seguida exibe esse mesmo caractere.
#include <stdio.h> int main() { char letra; printf("Insira um caractere: "); letra = getchar(); printf("Você digitou: '%c'", letra); }
Recebendo caracteres em C através das funçoes fgetc e getc
Essas funções também servem para armazenar caracteres, porém são mais gerais que a getchar(), pois podem receber dados de outras fontes, além da padrão (o teclado - stdin).Seus usos são semelhantes ao getchar(), porém temos que dizer ao C por onde o programa deve receber as informações.
No nosso caso, e pelo teclado, então fica: fgetc(stind) e getc(stdin)
Por exemplo, um aplicativo em C que recebe duas letras e mostra na tela seria:
#include <stdio.h> int main() { char letra1, letra2; printf("Insira um caractere: "); letra1 = getc(stdin); printf("Insira outro caractere: "); letra2 = getc(stdin); printf("Você digitou: '%c' e '%c'", letra1, letra2); }
É importante que você faça esse exemplo e veja o resultado. Agora teste com as outras funções: scanf e getchar
Estranho esse problema, não?
Isso tem a ver com uma região especial de memória, uma espécie de memória temporária chamada buffer, que vamos estudar mais no próximo artigo do curso C Progressivo.
18 comentários:
Não percebo o que estou a fazer errado, independentemente de que função utilize o aplicativo recebe a primeira letra mas não a segunda, indica logo o resultado!
Ex (c/ getchar - o resultado é o mesmo c/ todas):
#include
int main()
{
char letra1, letra2;
printf("Digite uma letra ");
letra1=getchar();
printf("Digite outra letra ");
letra2=getchar();
printf("As letras digitadas foram %c e %c", letra1, letra2);
}
E o resultado é (digitando m):
Digite uma letra m
Digite outra letra As letras digitadas foram m e
Process returned 31 (0x1F) execution time : 2.454 s
Press any key to continue.
Olá MB,
Leia o tutorial que vem logo na sequência, no índice de nossa apostila, sobre o Buffer em C.
Olá,
não tem exemplo usando fgetc()
Não se esqueça de inserir a biblioteca do C responsável por estes métodos no cabeçalhos do código.
#include
#include
#include
int main()
{
char letra1, letra2;
printf("Insira um caractere: ");
scanf("%c", & letra1);
printf("Insira outro caractere: ");
scanf("%c", & letra2);
printf("Você digitou: '%c' e '%c'", letra1, letra2);
}
\\-----------------------------
Comigo após eu digitar o primeiro valor a tela fechou e nao exibiu nehum resultado, tentei usar o dois comandos para tentar resolver o problema Getch (); e o Break (); mas não obtive resultado satisfatórios.
Galera boa tarde !
estava fazendo o mesmo código aqui e estava com o mesmo problema que vocês .... percebi que não precisava necessariamente de dois "PRINTSFS" . Segue abaixo o código :
#include
int main()
{
char letra1, letra2;
printf("Insira duas letras: ");
letra1 = getc(stdin);
letra2 = getc(stdin);
printf("Voce digitou: '%c' e '%c'", letra1, letra2);
getch();
system("pause");
return 0;
}
no caso ai , você ja digita as duas letra seguidas , ao contrário do exemplo padrão.
use system("pause");
Uma forma de resolver o problema apresentado no artigo é o uso do fflush(stdin); esse comando limpa o buffer de entrada.
#include
int main()
{
char letra1, letra2;
printf("Insira um caractere: ");
letra1 = getc(stdin);
printf("Insira outro caractere: ");
fflush(stdin);
letra2 = getc(stdin);
printf("Você digitou: '%c' e '%c'", letra1, letra2);
return 0;
}
Na minha opinião é melhor usar o gets(variável);, pois ele pode receber várias letras (palavras, frases...).
char palavra[limite de letras];
gets(palavra);
RenatoM
O segundo pgm na forma descrita para mim não funciona
a contento. Fiz alteração como abaixo
#include
int main ()
{
char letra1, letra2, letra3;
printf("Insira os caracteres: ");
letra1=getc(stdin), letra2=getc(stdin), letra3=getc(stdin);
printf("Você digitou:'%c'e'%c'e'%c'", letra1, letra2, letra3);
}
// este pgm está errado, não retorna o segundo caractere.
// funciona se você digitar os dois caracteres em sequência
e depois enter, portanto a primeira instrução deveria ser
insira caracteres + enter e a segunda instrução de digitar
o segundo caractere é sem efeito.
// forma minimizada para três caracteres.
Sds
\\faltou colocar o no #include para incluir a biblioteca ;D
#include
int main()
{
char letra1, letra2;
printf("Insira um caractere: ");
scanf("%c", & letra1);
printf("Insira outro caractere: ");
scanf("%c", & letra2);
printf("Você digitou: '%c' e '%c'", letra1, letra2);
}
Quando é melhor usar cada função scanf ou getchar ?
//Oi, o meu getchar() da erro, quando especifico um valor (quantidade);
#include
int main()
{
char a;
char a[100]; // Falha aqui
printf("Digite seu nome \n");
a = getchar();
printf("Seu nome é %c",a);
getch();
return 0;
// OBS Compilado no Turbo C
}
Por favor visitem meu canal no youtube. Tem gameplays de call of duty e violão. é só digitar na busca rafarnr. Obrigado
Segue a resolução usando scanf:
#include
int main()
{
char letra1,
letra2;
printf("Digite uma letra:\n");
scanf("%c",&letra1);
printf("Digite outra letra:\n");
scanf(" %c",&letra2);
printf("As letras que voce digitou foram: %c e %c\n",letra1,letra2);
return 0;
}
Miqueias o gets não é recomendado, pois pode ter estouro de buffer :\
Para resolver este erro do buffer voce deve inserir um espaço em branco antes do %c no scanf que recebera a variavel do tipo caracter.
Fica assim:
int letra;
printf("Digite uma letra: ");
scanf(" %c", letra);
quando eu uso getchar, só imprime a primeira letra de uma palavra digitada
Pessoal como ñ vi ninguém comentando a resposta do pq o programa teste ñ chega a pedir a 2 letra, resolvi comentar;
Bem, é o seguinte:
-Ele ñ pede a 2 letra pq ele já tem.
-Mas como assim se eu só digitei uma letra e dei ENTER?
-Exato o getc capturou a letra e o ENTER.
-Tá e o que tem isso?
-Simples. Char só armazena 1 valor. O programa capturou 2 valores no 1º getc e como ele ñ tinha como armazenar os dois valores na variável letra1 ele procurou a proxima variavel no programa e achou letra2.
Quem quiser pode verificar isso prenstando atenção ao fato que o printf imprime uma aspa em linha diferente ou, se quiser, digite ENTER para a mensagem "Insira um caractere: " e digitar qualquer letra numero para a segunda mesagem. O resultado será uma quebra de linha após a primeira aspa e o segundo valor irá retornar normalmente.
Postar um comentário