Utilisez la fonction getchar en C
-
Utiliser la fonction
getchar
pour lire un seul caractère d’un flux d’entrée standard en C -
Utiliser la fonction
getchar
pour lire une chaîne de caractères en C
Cet article présente plusieurs méthodes d’utilisation de la fonction getchar
en C.
Utiliser la fonction getchar
pour lire un seul caractère d’un flux d’entrée standard en C
La fonction getchar
fait partie des utilitaires d’entrée/sortie standard inclus dans la bibliothèque C. Il existe de nombreuses fonctions pour les opérations d’entrée/sortie de caractères comme fgetc
, getc
, fputc
ou putchar
. fgetc
et getc
ont fondamentalement des caractéristiques équivalentes ; ils prennent le pointeur de flux de fichiers pour lire un caractère et le renvoient comme un unsigned char
vers un type int
.
Notez que getchar
est le cas spécifique de getc
qui passe implicitement le flux de fichiers stdin
comme argument pour lire les caractères. Ainsi, getchar
ne prend aucun argument et renvoie le caractère lu vers le type int
. Dans l’exemple suivant, nous démontrons le scénario de base de la saisie d’un seul caractère et de son impression avec la fonction 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);
}
Utiliser la fonction getchar
pour lire une chaîne de caractères en C
Alternativement, nous pouvons implémenter une boucle pour lire la chaîne de caractères entrée jusqu’à ce que la nouvelle ligne ou EOF
soit rencontrée, et la stocker dans un tampon char
préalloué. Notez cependant que cette méthode ajoute un surcroît de performance par rapport aux appels à gets
ou getline
, qui sont des fonctions de bibliothèque implémentant la même fonctionnalité. La partie principale de la solution est une boucle while
qui s’exécute jusqu’à ce que la valeur retournée par la fonction getchar
ne soit pas égale au nouveau caractère de ligne ou EOF
.
Dans ce cas, nous avons arbitrairement alloué un tableau de char
de taille - 20 caractères. À chaque itération, le pointeur vers le premier élément du tableau est implémenté, et la valeur de retour de getchar
lui est attribuée. Enfin, nous produisons le tampon avec l’appel de fonction 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);
}
Production :
Please, provide input: string longer than 20 characters
string longer than 20 characters
Bien que le code de l’exemple précédent puisse généralement fonctionner parfaitement, il comporte plusieurs erreurs qui peuvent entraîner des bogues de débordement de tampon ou une interruption anormale du programme. Puisque nous traitons l’entrée de l’utilisateur jusqu’à ce que la nouvelle ligne ou EOF
soit rencontrée, il n’y a aucune garantie qu’elle tiendra dans le tampon char
de taille fixe. Si nous devons utiliser un tampon fixe, nous sommes responsables de garder un compte de la taille de l’entrée et d’arrêter de la stocker dans le tampon une fois que la capacité est atteinte.
Après avoir résolu ce problème dans le code précédent, nous devons nous occuper de l’instruction printf
qui utilise le spécificateur %s
pour imprimer le contenu du tampon. Notez qu’il n’y a aucune garantie que le dernier caractère de la chaîne d’entrée soit un octet nul, donc l’appel printf
ne saurait pas où s’arrêter si l’utilisateur lui-même n’insère pas l’octet nul à la fin du tampon. L’exemple de code suivant corrige les erreurs précédentes et ajoute quelques lignes pour une meilleure démonstration.
#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);
}
Production :
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