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.

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

Jhon Lenon Plantikow 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

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

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

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

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.