Есть цикл, если я ввожу больше 32 символов, то количество Enter pass: , увеличиваеться

Есть цикл, в нём для input записано 32 символа, если я ввожу больше 32 символов, то количество Enter pass:, увеличиваеться Сам код:

#include <stdio.h>

int main()
{
    int i = 0;
    char pass[] = "1999";
    char input[32];
    while (1) {
        printf_s("Enter pass: ");
        fgets(input, sizeof(input), stdin);
    }
    return 0;
}

Почему так происходит? Что по этому можно почитать? И есть ли тут уязвимость при большем введении символов для input?


Ответы (1 шт):

Автор решения: Lebchik

При запуске, твоя программа получает буфер ввода. Этот буфер -- условный большой массив, обозначаемый в Си именем stdin. Когда программа запрашивает ввод, посылаемые ей символы записываются именно в stdin.

После завершения ввода функция fgets(input, sizeof(input), stdin) копирует не больше sizeof(input) байт из stdin в input. Таким образом, если введено было больше 32 байт, то после их копирования в буфере stdin остаются ещё байты. Так функция fgets() при следующей итерации сразу получает те самые оставшиеся в stdin байты как новую партию ввода.

UPD: не сразу заметил, что fflush() не работает в данном случае. Можно использовать следующий код:

#include <stdio.h>

int main()
{
    int i = 0;
    char pass[] = "1999";
    char input[32];
    while (1) {
        printf("Enter pass: ");
        for (int i = 0; i < 32; i++)
            input[i] = getchar();
        input[i] = '\0';
    }
    return 0;
}
→ Ссылка