Fonctions de la bibliothèque C -gets()

Bibliothèque standard C - <stdio.h>


Dans le langage C,gets()C'est une fonction classique utilisée pour lire des chaînes depuis l'entrée standard. Bien qu'elle soit simple d'utilisation, il faut noter des problèmes de sécurité.

gets()fonction depuisl'entrée standard stdinElle lit une ligne de chaîne et la stocke dans le tableau de caractères spécifié. Elle lit les caractères jusqu'à ce qu'un caractère de nouvelle ligne ou la fin de fichier soit rencontré.

Avertissement important:gets()Elle présente de graves vulnérabilités de sécurité et ne permet pas de spécifier la taille du tampon, ce qui peut facilement entraîner un débordement de tampon. Par conséquent, dans la programmation C moderne,fgets()est un meilleur choix.

Définitions de mots:getsignifie "get",sreprésente "string", et une fois combinés, ils signifient "get string".


Syntaxe de base et paramètres

gets()C'est une fonction de la bibliothèque standard C et elle nécessite d'inclure le fichier d'en-tête.<stdio.h>。

Format de syntaxe

char *gets(char *str);

Description des paramètres

  • Paramètre: str
    • Type :char *(pointeur vers un tableau de caractères)
    • Description : un pointeur vers un tableau de caractères, utilisé pour stocker la chaîne C lue. Vous devez vous assurer que le tableau est suffisamment grand pour accueillir la chaîne d'entrée.

Description de la fonction

  • Valeur de retour: En cas de succès, renvoie un pointeur versstrpointeur. Si une erreur se produit ou si la fin du fichier est atteinte sans qu'aucun caractère n'ait été lu, elle renvoieNULL。
  • Effet: La chaîne lue (sans le caractère de nouvelle ligne) sera stockée dansstrle tableau pointé, et un caractère nul est automatiquement ajouté à la fin.\0comme terminateur de chaîne.

Exemple

Maîtrisons à travers des exemplesgets()Utilisation.

Exemple 1 : Utilisation de base - Lecture d'une chaîne

Exemple

#include <stdio.h>

int main()
{
   char str[50];

   printf("Veuillez saisir une chaîne : ");
   gets(str);

   printf("La chaîne que vous avez saisie est : %s", str);

   return(0);
}

Sortie attendue :

请输入一个字符串:example
您输入的字符串是:example

Analyse du code :

  1. #include <stdio.h>est d'utilisergets()Prérequis de la fonction.
  2. char str[50];Il définit un tableau de caractères de longueur 50 pour stocker la chaîne d'entrée.
  3. gets(str);Il lit une ligne de chaîne depuis l'entrée standard et la stocke dansstrDans.
  4. printf("您输入的字符串是:%s", str);Utilisation%sles spécificateurs de format affichent des chaînes.

Exemple 2 : Gestion du cas où la valeur de retour est NULL

Dans la programmation réelle, vous devez vérifiergets()la valeur de retour pour gérer les erreurs possibles.

Exemple

#include <stdio.h>

int main()
{
   char str[100];
   char *result;

   printf("Veuillez saisir du contenu (appuyez sur Ctrl+D pour terminer) :\n");
   result = gets(str);

   if (result != NULL) {
       printf("Lecture réussie, le contenu est :\n%s\n", str);
   } else {
       printf("La lecture a échoué ou la fin du fichier a été atteinte !\n");
   }

   return(0);
}

Analyse du code :

  • gets()Il renvoie un pointeur vers la même chaîne ; en cas d'échec, il renvoieNULL。
  • Lorsque l'utilisateur appuie sur Ctrl+D (Linux/Mac) ou Ctrl+Z (Windows), la condition de fin de fichier est déclenchée,gets()returnNULL。
  • Dans les projets réels, il est recommandé d'utiliser la plus sûrefgets()Alternativegets()。

Exemple 3 : Problèmes de sécurité de gets() (⚠️ Démonstration d'opérations dangereuses)

L'exemple suivant montre pourquoigets()n'est pas sûr.

Exemple

#include <stdio.h>

int main()
{
   // Remarque : cet exemple est dangereux et est uniquement à titre de démonstration !
   char buffer[10];

   printf("Veuillez saisir une chaîne plus longue (plus de 10 caractères) :\n");
   gets(buffer);  // Aucune vérification des limites, peut provoquer un dépassement de tampon

   printf("Vous avez saisi : %s\n", buffer);

   return(0);
}

Analyse du code :

  • buffer[10]Seuls 10 octets d'espace sont alloués.
  • Si l'utilisateur saisit une chaîne dépassant 9 caractères (plus le\0), cela provoquera undépassement de tampon, peut écraser des zones mémoire adjacentes.
  • Cela peut être exploité par des attaquants pour exécuter du code malveillant ; par conséquent,gets()Il a été marqué comme obsolète dans la norme C99 et a même été supprimé dans la norme C11.

Meilleure alternative : fgets()

Il est fortement recommandé d'utiliserfgets()à la placegets(), car il permet de spécifier la taille du tampon.

Exemple

#include <stdio.h>

int main()
{
   char str[50];

   printf("Veuillez saisir une chaîne : ");
   // fgets(tampon, taille du tampon, flux de fichier)
   fgets(str, sizeof(str), stdin);

   // Supprimer le caractère de nouvelle ligne lu par fgets
   // Méthode : trouver le caractère de nouvelle ligne et le remplacer par un caractère nul
   for (int i = 0; str[i] != '\0'; i++) {
       if (str[i] == '\n') {
           str[i] = '\0';
           break;
       }
   }

   printf("La chaîne que vous avez saisie est : %s\n", str);

   return(0);
}

fgets()Avantages :

  • Il permet de spécifier le nombre maximal de caractères à lire, ce qui évite le dépassement de tampon.
  • Il conserve le caractère de saut de ligne à la fin de la chaîne (peut être supprimé manuellement si nécessaire).
  • Il peut spécifier la source d'entrée (entrée standard, fichier, etc.).

Bibliothèque standard C - <stdio.h>

autres extensions