2013-08-29 48 views
2

當我運行這段代碼:沖洗標準輸入(消耗整個文本,並繼續在多被粘貼)

#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);' –

相關問題