Umgang mit Benutzereingaben unbekannter Größe in C
Hier sind zwei Beispiele für die Benutzereingabe in C.
1. scanf
Diese Methode ist leicht durch Pufferüberlauf anzugreifen. Versuchen Sie, einige Zeichen einzugeben, die über das hinausgehen, was Sie als Pufferüberlauf deklarieren.
#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
Diese Methode kann den Pufferüberlauf schützen, indem die Benutzereingabe von Zeichen begrenzt wird.
#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; }
Die beiden oben genannten Methoden können jedoch nur normale Benutzereingaben verarbeiten:how about i want to handle user input with 1000 or even more characters? Ja, wir können wie "char bStr[1000]
" oder noch größer deklarieren, aber dies ist nicht dynamisch und flexibel genug.
Lösung
Um dies zu beheben, wirdrealloc()
verwendet, um die Speichergröße dynamisch zu erhöhen. Lassen Sie uns zuerst sehen, wie der Pufferüberlauf oben "scanf ()" aussieht. Geben Sie einfach mehr als das ein, was Sie deklarieren, und sehen Sie das Ergebnis unten.
Im folgenden Beispiel wird die dynamische Speicherzuweisung (Realloc) in C verwendet, um Benutzereingaben in unbekannter Größe zu verarbeiten.
#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; }
Fertig, jetzt kann das Programm Benutzereingaben unbekannter Größe problemlos verarbeiten.