2012-10-15 72 views
1

我有一個程序通過scanf過濾輸入。 我想只讀數字和大寫字母+空格。過濾scanf導致無限循環

最近我試圖做這樣的事情,它卡在一個無限循環,仍然只打印第一個輸入。 我知道fgets(),但我知道這工作。 我找不到問題出在哪裏。 這是簡化的情況;我是怎麼了?

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

int main() 
{ 
    char str[21]; 

    do 
    { 
    scanf("%20[0-9A-Z ]", str); 
    printf("%s\n", str); 
    } while(strcmp("END", str) != 0); 

    return 0; 
} 

編輯:我忘了提,輸入是有效的,輸入:「你好」節目卡......和scanf只對第一個輸入返回1,爲他人返回0 我也試過fflush(stdin),在閱讀後.​​..

+1

它更好地使用'getc(stdin)'並檢查字符,直到它獲得20個有效字符。 –

+0

@ shiplu.mokadd.im - 是的,我知道這些功能,但我想使它與scanf(),因爲,在很久以前,我做了一些與它.. –

+0

更好地首先閱讀用戶輸入,然後評估其內容通過'sscanf()' – Wolf

回答

2

scanf只接受數字,大寫字母(拉丁字母)和空格,

scanf("%20[0-9A-Z ]", str); 

所以當你進入別的,scanf無法分配輸入str,並違規輸入保持在輸入緩衝。您需要檢查掃描是否成功,並在發生故障時清除輸入緩衝區。

由於特別是換行符不在有效的輸入令牌之中,所以如果輸入來自例如輸入緩衝器,則需要清除輸入緩衝器直到下一個換行符。鍵盤而不是無換行符的輸入流。

int c; 
do 
{ 
    scanf("%20[0-9A-Z ]", str); 
    printf("%s\n", str); 
    while((c = getchar()) != '\n' && c != EOF); // clear input buffer 
} while(c != EOF && strcmp("END", str) != 0); 
+0

我忘了提及輸入有效... –

+0

程序如何接收輸入?請注意,換行符也是無效的輸入。 –

+0

從鍵盤上... –

0

取決於輸入一點 - 但你可以檢查scanf的工作 - 它會返回匹配表達式的數量 - 所以在這種情況下應該是1。 如果它的0 - 它與輸入不匹配,所以它可能會粘在它的位置。