Comment gérer une entrée utilisateur de taille inconnue en C
Voici deux exemples pour gérer les entrées utilisateur en C.
1. scanf
Cette méthode est facile à obtenir une attaque par débordement de tampon, essayez de saisir certains caractères qui sont plus que ce que vous déclarez expérimenter à propos de ce qu'est un débordement de tampon.
#include #include int main() { char bStr[80]; printf("\nEnter a very very very long String value:"); scanf("%s", bStr); printf("\nLong String value:%s \n\n",bStr); return 0; }
2. fgets
Cette méthode peut protéger le débordement de la mémoire tampon en limitant l'entrée utilisateur de caractères.
#include #include int main() { char bStr[80]; printf("\nEnter a very very very long String value:"); fgets ( bStr, 80, stdin ); printf("\nLong String value:%s \n\n",bStr); return 0; }
Cependant, les deux méthodes ci-dessus ne peuvent gérer que les entrées utilisateur normales,how about i want to handle user input with 1000 or even more characters? Oui, nous pouvons déclarer comme «char bStr[1000]
» ou même une taille plus grande, mais ce n'est pas assez dynamique et flexible.
Solution
Pour résoudre ce problème, utiliserealloc()
pour augmenter dynamiquement la taille de la mémoire. Voyons d'abord à quoi ressemble le débordement de tampon `scanf ()` ci-dessus, saisissez simplement plus que ce que vous déclarez et voyez le résultat ci-dessous.
Exemple ci-dessous utilisant l'allocation dynamique de mémoire (realloc) en C pour gérer les entrées utilisateur de taille inconnue.
#include #include int main() { unsigned int len_max = 128; unsigned int current_size = 0; char *pStr = malloc(len_max); current_size = len_max; printf("\nEnter a very very very long String value:"); if(pStr != NULL) { int c = EOF; unsigned int i =0; //accept user input until hit enter or end of file while (( c = getchar() ) != '\n' && c != EOF) { pStr[i++]=(char)c; //if i reached maximize size then realloc size if(i == current_size) { current_size = i+len_max; pStr = realloc(pStr, current_size); } } pStr[i] = '\0'; printf("\nLong String value:%s \n\n",pStr); //free it free(pStr); pStr = NULL; } return 0; }
Terminé, le programme peut désormais gérer facilement les entrées utilisateur de taille inconnue.