Как предотвратить многократное выполнение fgets при переполнении буфера? - PullRequest
2 голосов
/ 21 марта 2019

У меня проблема в том, что если пользователь вводит значение, превышающее максимальное количество символов, такое как «abcdefg», когда максимальное значение равно 5, fgets(), который находится внутри цикла, выполняется дважды, а вместо «abcd» его вместо этого печатает «abcd», затем «efg».

Я думаю, это потому, что fgets() обрабатывает только до 4 символов и нулевого терминатора, но в буфере stdin все еще есть "efg".

Мне было интересно, есть ли способ только захватить "abcd" и отбросить оставшуюся часть любого оставшегося ввода, превышающего максимальный размер выделенного буфера.

#define INPUT_MAX 5
int main(int argc, char* argv[]){
    char input[INPUT_MAX];
    while(1){
        printf("prompt> ");
        fgets(input, INPUT_MAX, stdin);
        printf("\n%s\n", input);
    }
}

Пример RUN:

prompt> abcdefg   <-- I press enter once here for /n

abcd
prompt> 
efg

prompt> .         <-- I end up here after enter command

Я обнаружил, что fflush(stdin) не является правильным способом очистки стандартного ввода.

1 Ответ

3 голосов
/ 21 марта 2019

Там нет ничего автоматического.Проверьте, заканчивается ли ввод новой строкой.Если этого не произойдет, вызывайте getchar() в цикле, пока не получите перевод строки или EOF.

while(1){
    printf("prompt> ");
    if (fgets(input, INPUT_MAX, stdin) == NULL) {
        break;
    }
    printf("\n%s\n", input);
    if (input[strlen(input)-1] != '\n') {
        for (int c; (c = getchar()) != EOF && c != '\n';)
            ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...