GETS |
Demande un chaîne |
---|---|
Langage C++ | cstdio (stdio.h) |
Syntaxe
char *gets(char *buf) |
Paramètres
Nom | Description |
---|---|
buf | Ce paramètre permet d'indiquer le tampon de réception des données |
Description
Cette fonction effectue la lecture d'une chaîne de caractères à partir de la console standard.
Remarques
- La fonction gets() lit les caractères de stdin et les place dans le tableau de caractères pointé par buf. Les caractères sont lus jusqu'à ce qu'une nouvelle ligne ou un EOF soit reçu. Le caractère de nouvelle ligne ne fait pas partie de la chaîne de caractères; au lieu de cela, il est convertie en null pour terminer la chaîne de caractères.
- En cas de succès, la fonction gets() renvoie buf; un pointeur null est retourné en cas d'échec. Si une erreur de lecture se produit, le contenu du tableau pointé par buf est indéterminé. Étant donné qu'un pointeur null sera retourné lorsqu'une erreur s'est produite ou lorsque la fin du fichier est atteinte, vous devez utiliser feof() ou ferror() pour déterminer ce qui s'est réellement produit.
- Il n'y a aucun moyen de limiter le nombre de caractères lus par gets() et c'est donc à vous de vous assurer que le tableau pointé par buf ne sera pas dépassé.
- Définition et fonctionnement : gets était une fonction de la bibliothèque standard du C définie dans <cstdio>. Elle permettait de lire une ligne de texte depuis l'entrée standard (stdin) et de l'entreposer dans un tableau de caractères fourni par l'utilisateur. Elle ne permettait cependant pas de limiter la taille de l'entrée, ce qui la rendait dangereuse.
- Problème de dépassement de mémoire (Buffer Overflow) : gets ne vérifiait pas si la chaîne de caractères fournie pouvait contenir toute l'entrée utilisateur. Si l'utilisateur entrait plus de caractères que la capacité du tampon alloué, cela écrasait d'autres données en mémoire, pouvant corrompre le programme ou créer une faille de sécurité.
- Retrait du standard C et C++ : En raison de sa dangerosité, gets a été officiellement supprimée du standard C++ à partir de C++11 et du standard C avec C11. Les compilateurs modernes affichent des avertissements ou des erreurs si on tente de l'utiliser.
- Alternative : fgets : Pour éviter les dépassements de mémoire, il est recommandé d'utiliser fgets, permettant de spécifier une taille maximale pour l'entrée :
- Pourquoi certains codes anciens utilisent encore gets ? De nombreux anciens codes sources utilisent gets car elle était pratique et facile à utiliser. Cependant, dans les projets modernes, son utilisation est fortement déconseillée. Certains compilateurs récents peuvent encore l'inclure pour compatibilité, mais elle génère généralement un avertissement ou une erreur.
- Risque en cybersécurité (exploits et attaques) : En raison du dépassement de mémoire qu'elle peut provoquer, gets a été historiquement une cible d'attaques par injection de code malveillant. Elle pouvait permettre à un attaquant d'écrire du code dans la mémoire du programme et d'exécuter des instructions arbitraires, facilitant les attaques par dépassement de tampon (buffer overflow).
- Utilisation interdite dans les bonnes pratiques de programmation : Des organisations comme le CERT (Computer Emergency Response Team) et des guides de codage sécurisés comme le MISRA C (pour les systèmes embarqués) interdisent totalement l'utilisation de gets. Il est fortement recommandé d'utiliser fgets ou des alternatives modernes comme std::getline en C++.
fgets s'assure de ne pas dépasser la taille du tableau, mais elle peut conserver le caractère \n si l'entrée est plus courte que la taille spécifiée.
Exemple
Voici un exemple d'utilisation de cette fonction :

on obtiendra le résultat semblable suivant :
Entrez votre texte ici et appuyez sur ENTER :j'entre du texte ici !
Voici le résultat que vous avez entrer : j'entre du texte ici !
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - fgets
Langage de programmation - C++ - Référence de procédures et fonctions - fread
Langage de programmation - C++ - Référence de procédures et fonctions - fputs
Langage de programmation - C - Référence de procédures et fonctions - gets
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 732.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 131.