Как обрабатывать пользовательский ввод неизвестного размера в 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;
}

Готово, теперь программа может легко обрабатывать ввод данных неизвестного размера.