Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Recebendo letras do usuário - As funções scanf, getchar, fgetc e getc

No artigo passado de nosso curso de C, aprendemos como usar a função scanf para receber dados do usuário, e com isso fazer programas bem mais dinâmicos.

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.

Recebendo caracteres em C através da função scanf()

A maneira é idêntica a que fizemos quando usamos a função scanf() para capturar números digitados pelo usuário, que como ensinado no artigo passado de nossa apostila.

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

A função scanf() é bem poderosa e flexível.
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:

MB disse...

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.

Apostila C Progressivo disse...

Olá MB,

Leia o tutorial que vem logo na sequência, no índice de nossa apostila, sobre o Buffer em C.

Anônimo disse...

Olá,

não tem exemplo usando fgetc()

Unknown disse...

Não se esqueça de inserir a biblioteca do C responsável por estes métodos no cabeçalhos do código.
#include

Unknown disse...

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

Rafael Ferreira disse...

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.

Anônimo disse...

use system("pause");

Anônimo disse...

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;
}

Unknown disse...

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

Renato disse...

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

Felipe Fontana disse...

\\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);
}

Meu disse...

Quando é melhor usar cada função scanf ou getchar ?

Rafael Franco disse...

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

Anônimo disse...

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;
}

Anônimo disse...

Miqueias o gets não é recomendado, pois pode ter estouro de buffer :\

Anônimo disse...

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

Alan Silva disse...

quando eu uso getchar, só imprime a primeira letra de uma palavra digitada

Kaasi disse...

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.