Usa la funzione getchar in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione getchar per leggere un singolo carattere dal flusso di input standard in C
  2. Usa la funzione getchar per leggere l’input di stringhe in C
Usa la funzione getchar in C

Questo articolo mostrerà diversi metodi su come utilizzare la funzione getchar in C.

Usa la funzione getchar per leggere un singolo carattere dal flusso di input standard in C

La funzione getchar fa parte delle utilità di input/output standard incluse nella libreria C. Ci sono più funzioni per le operazioni di input/output dei caratteri come fgetc, getc, fputc o putchar. fgetc e getc hanno fondamentalmente caratteristiche equivalenti; prendono il puntatore del flusso di file per leggere un carattere e lo restituiscono come un cast di unsigned char a un tipo int.

Nota che getchar è il caso specifico di getc che passa implicitamente il flusso di file stdin come argomento da cui leggere i caratteri. Pertanto, getchar non accetta argomenti e restituisce il carattere di lettura lanciato al tipo int. Nell’esempio seguente, mostriamo lo scenario di base di inserire un singolo carattere e stamparlo con la funzione 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);
}

Usa la funzione getchar per leggere l’input di stringhe in C

In alternativa, possiamo implementare un bucle per leggere la stringa in ingresso fino a quando non viene incontrata la nuova linea o EOF e memorizzarlo in un buffer char preallocato. Ricorda però che questo metodo aggiunge un sovraccarico delle prestazioni rispetto alle chiamate a gets o getline, che sono funzioni di libreria che implementano la stessa caratteristica. La parte principale della soluzione è un cicli while che viene eseguito finché il valore restituito dalla funzione getchar non è uguale al nuovo carattere di linea o EOF.

In questo caso, abbiamo arbitrariamente assegnato un array char di dimensione - 20 caratteri. Ad ogni iterazione viene implementato il puntatore al primo elemento dell’array e gli viene assegnato il valore restituito da getchar. Infine, emettiamo il buffer con la chiamata alla funzione 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);
}

Produzione:

Please, provide input: string longer than 20 characters
string longer than 20 characters

Anche se il codice di esempio precedente di solito potrebbe funzionare correttamente, presenta diversi errori che possono causare bug di overflow del buffer o terminazione anomala del programma. Poiché elaboriamo l’input dell’utente fino a quando non viene incontrata la nuova linea o EOF, non ci sono garanzie che si adatti al buffer char di dimensione fissa. Se dobbiamo utilizzare un buffer fisso, siamo responsabili di tenere un conteggio della dimensione dell’input e di interrompere la memorizzazione nel buffer dopo che la capacità è stata raggiunta.

Dopo aver risolto questo problema nel codice precedente, dobbiamo occuparci dell’istruzione printf che utilizza l’identificatore %s per stampare il contenuto del buffer. Si noti che non vi è alcuna garanzia che l’ultimo carattere della stringa di input sia un byte nullo, quindi la chiamata printf non saprebbe dove fermarsi se l’utente stesso non inserisce il byte nullo alla fine del buffer. Il seguente codice di esempio corregge gli errori precedenti e aggiunge alcune righe per una migliore dimostrazione.

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

Produzione:

Please, provide input: string longer than 20 characters
Truncation occured!
string longer than
Autore: 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

Articolo correlato - C Char