Use a função getchar em C
-
Use a função
getchar
para ler um único caractere do fluxo de entrada padrão em C -
Use a função
getchar
para ler a entrada de string em C
Este artigo irá demonstrar vários métodos sobre como usar a função getchar
em C.
Use a função getchar
para ler um único caractere do fluxo de entrada padrão em C
A função getchar
faz parte dos utilitários de entrada/saída padrão incluídos na biblioteca C. Existem várias funções para operações de entrada/saída de caracteres como fgetc
, getc
, fputc
ou putchar
. fgetc
e getc
têm basicamente características equivalentes; eles pegam o ponteiro do fluxo de arquivos para ler um caractere e o retornam como um unsigned char
convertido para um tipo int
.
Observe que getchar
é o caso específico de getc
que passa implicitamente o fluxo de arquivo stdin
como um argumento para leitura de caracteres. Assim, getchar
não aceita argumentos e retorna o caractere lido convertido para o tipo int
. No exemplo a seguir, demonstramos o cenário básico de inserir um único caractere e imprimi-lo com a função putchar
.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int ch;
printf("Please, input a single character: ");
ch = getchar();
putchar(ch);
exit(EXIT_SUCCESS);
}
Use a função getchar
para ler a entrada de string em C
Como alternativa, podemos implementar um loop para ler a entrada da string até que a nova linha ou EOF
seja encontrada e armazená-la em um buffer char
pré-alocado. Lembre-se, porém, de que este método adiciona sobrecarga de desempenho em comparação com chamadas para gets
ou getline
, que são funções de biblioteca que implementam o mesmo recurso. A parte principal da solução é um loop while
que executa até que o valor retornado da função getchar
não seja igual ao caractere de nova linha ou EOF
.
Nesse caso, alocamos arbitrariamente um array char
de tamanho - 20 caracteres. A cada iteração, o ponteiro para o primeiro elemento do array é implementado e o valor de retorno de getchar
é atribuído a ele. Finalmente, geramos o buffer com a chamada de função printf
.
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 20 };
int main(void) {
char buf[SIZE];
char *p;
int ch;
p = buf;
printf("Please, provide input: ");
while ((ch = getchar()) != '\n' && ch != EOF) {
*p++ = (char)ch;
}
*p++ = 0;
if (ch == EOF) {
printf("EOF encountered\n");
}
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
Resultado:
Please, provide input: string longer than 20 characters
string longer than 20 characters
Mesmo que o código do exemplo anterior possa funcionar bem, ele contém vários erros que podem resultar em erros de estouro de buffer ou encerramento anormal do programa. Uma vez que processamos a entrada do usuário até que a nova linha ou EOF
seja encontrada, não há garantias de que caiba no buffer char
de tamanho fixo. Se tivermos que usar um buffer fixo, somos responsáveis por manter uma contagem do tamanho da entrada e parar de armazená-lo no buffer depois que a capacidade for atingida.
Depois de resolver esse problema no código anterior, temos que lidar com a instrução printf
que usa o especificador %s
para imprimir o conteúdo do buffer. Observe que não há garantia de que o último caractere da string de entrada seja um byte nulo, então a chamada printf
não saberia onde parar se o próprio usuário não inserir o byte nulo no final do buffer. O código de exemplo a seguir corrige os erros anteriores e adiciona algumas linhas para melhor demonstração.
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 20 };
int main(void) {
char buf[SIZE];
int ch;
size_t index = 0;
size_t chars_read = 0;
printf("Please, provide input: ");
while ((ch = getchar()) != '\n' && ch != EOF) {
if (index < sizeof(buf) - 1) {
buf[index++] = (char)ch;
}
chars_read++;
}
buf[index] = '\0';
if (ch == EOF) {
printf("EOF encountered\n");
}
if (chars_read > index) {
printf("Truncation occured!\n");
}
printf("%s\n", buf);
exit(EXIT_SUCCESS);
}
Resultado:
Please, provide input: string longer than 20 characters
Truncation occured!
string longer than
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook