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.
- Type :
Description de la fonction
- Valeur de retour: En cas de succès, renvoie un pointeur vers
strpointeur. 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 dans
strle 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
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 :
#include <stdio.h>est d'utilisergets()Prérequis de la fonction.char str[50];Il définit un tableau de caractères de longueur 50 pour stocker la chaîne d'entrée.gets(str);Il lit une ligne de chaîne depuis l'entrée standard et la stocke dansstrDans.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
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ûre
fgets()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
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
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.).
autres extensions