2013-08-29 1 views
2

Когда я запускаю этот код:Flush STDIN (потребляют весь текст и продолжить, когда многострочный наклеена)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

static void flush_stdin(void) 
{ 
    int c; 

    while ((c = fgetc(stdin)) != '\n' && c != EOF); 
} 

static int scand(int *val, int min, int max) 
{ 
    char s[32], *p = NULL; 
    long x = 0; 

    if (fgets(s, sizeof s, stdin)) { 
     x = strtol(s, &p, 10); 
     if (strchr(p, '\n') == NULL) flush_stdin(); 
    } 
    if (p == NULL || *p != '\n' || x < min || x > max) { 
     *val = 0; 
     return 0; 
    } else { 
     *val = (int)x; 
     return 1; 
    } 
} 

int main(void) 
{ 
    int x; 

    do { 
     printf("Number (1-10): \n"); 
    } while (scand(&x, 1, 10) == 0); 
    printf("Number = %d\n", x); 
    return 0; 
} 

И вставить следующий текст:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

Я даю этот вывод:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
Number (1-10): 
Number (1-10): 
Number (1-10): 

printf("Number (1-10): \n"); обрабатывается для каждой вставки.

Можно ли (смыть) весь текст перед возвратом scand(), чтобы обработать только один printf?

ответ

1

Если терминал находится в нестандартном режиме, вы можете использовать fgetc прочитать заранее и/или read читать символы заранее и выводить Number (1-10): только тогда, когда буферы пусты, и, таким образом, вы можете быть уверены, что пользователь не имеет набрал (или скопировал &) дополнительные строки текста.

1

Причина, по которой очищается только одна строка, заключается в том, что в вашей функции flush_stdin() вы проверяете как \ n, так и EOF. Модифицировано до

while ((c = fgetc(stdin)) != EOF); 

будет потреблять все три линии.

+1

@ahnlak Тогда вам придется подождать EOF 'ctrl + D' или' Ctrl + Z' – P0W

+0

Вы правы, конечно - мое плохое, я мысленно думал о сыром режиме. – ahnlak

+0

@ahnlak, 'while ((c = fgetc (stdin))! = '\ N' && c! = EOF);' –

Смежные вопросы