Как обрабатывать пользовательский ввод неизвестного размера в C

Как обрабатывать пользовательский ввод неизвестного размера в 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 ()`, просто введите больше, чем заявлено, и посмотрите результат ниже.

image

Ниже приведен пример использования динамического выделения памяти (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;
}

image

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