Utilisez la fonction getchar en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction getchar pour lire un seul caractère d’un flux d’entrée standard en C
  2. Utiliser la fonction getchar pour lire une chaîne de caractères en C
Utilisez la fonction getchar 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
Auteur: 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

Article connexe - C Char