Usa la funzione getchar in C
-
Usa la funzione
getchar
per leggere un singolo carattere dal flusso di input standard in C -
Usa la funzione
getchar
per leggere l’input di stringhe 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
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