Как обрабатывать пользовательский ввод неизвестного размера в C
Вот два примера для обработки пользовательского ввода в C.
1. зсапЕ
Этот метод легко получить атаку переполнением буфера, попробуйте ввести несколько символов, которые больше, чем вы объявляете о том, что такое переполнение буфера.
#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
Этот метод может защитить переполнение буфера путем ограничения ввода символов пользователем.
#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; }
Однако два вышеуказанных метода могут обрабатывать только обычный ввод пользователя,how about i want to handle user input with 1000 or even more characters? Да, мы можем объявить как «char bStr[1000]
» или даже больший размер, но это недостаточно динамично и гибко.
Решение
Чтобы исправить это, используетrealloc()
для динамического увеличения размера памяти. Сначала давайте посмотрим, как выглядит переполнение буфера `scanf ()`, просто введите больше, чем заявлено, и посмотрите результат ниже.
Ниже приведен пример использования динамического выделения памяти (realloc) в C для обработки пользовательского ввода в неизвестном размере.
#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; }
Готово, теперь программа может легко обрабатывать ввод данных неизвестного размера.