Use a função getchar em C

Jinku Hu 12 outubro 2023
  1. Use a função getchar para ler um único caractere do fluxo de entrada padrão em C
  2. Use a função getchar para ler a entrada de string em C
Use a função getchar 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artigo relacionado - C Char