2016-01-06 80 views
-2

我試圖接受用戶的輸入並檢查它是否等於某個選項('+',' - ','*','x')C:do-while with scanf,多輸入

do { 
     printf("Select the op.: "); 
     scanf("%c", &option); 
    } while (option != '+' || option != '-' || option != '*' || option != 'x'); 
    printf("%c", option); 

這是輸出:

Select the op.:Select the op.:Select the op.:Select the op.: 

正如你可以看到printf("Select the op.: ")執行多次,我不能明白其中的道理,因此,如果我嘗試插入,如+,這是打印輸出:

++ 

在此先感謝

+0

它編譯好嗎?我看到分號丟失。 – rootkea

+1

另外'選項'和'操作'。這是一個錯字嗎?你編譯過代碼嗎? – rootkea

+0

是的,我有代碼到另一臺電腦,所以我只是手工複製它,編輯。順便編譯好;) – Francesco

回答

3

您使用的條件始終爲真。您應該使用&&而不是||。製作真相表以便親自驗證。 爲什麼不使用strchr?條件會更優雅:

do { 
    printf("Select the op.: "); 
    if (1 != scanf(" %c", &option)) break; 
} while (!strchr("+-*x", option)); 

此外,對於您的其他問題,考慮到printf執行多次的事實是,緩衝,保持換行符的使用類型,以他們的選擇發送到scanf 。因此在下一個循環中,前一個循環的換行符將被scanf接受。這不是一個有效的選擇,所以,下一個循環會再次問你。 您可以通過編寫scanf來更正:scanf(" %c", &option)這僅僅是因爲你知道你只想丟棄一個空格字符。這不是一個全時解決方案。

+0

非常感謝你 – Francesco

+2

如果你打到文件結尾,這將失敗。你必須檢查'scanf'的返回值:'if(scanf(「%c」,&option)!= 1)break;' – chqrlie

+1

@chqrlie謝謝指出。我編輯了代碼。 – gon1332

11
while(option != '+' || option != '-' || option != '*' || option != 'x'); 

這種情況是總是如此。

2

您的終止條件不符合您的要求。試試這個:

do 
{ 
    ... 
} 
while(option != '+' && option != '-' && option != '*' && option != 'x'); 

這意味着只要繼續環路option+,而不是-,而不是*而不是x

相同的情況是:

do 
{ 
    ... 
} 
while(!(option == '+' || option == '-' || option == '*' || option == 'x')); 

除了從scanf此檢查返回值,如gon1332在他完美的答案呢。

+0

謝謝,但我再次打印'選擇操作:'之前,我可以實際插入一個輸入 – Francesco

+0

您還必須檢查'scanf'的返回值,以避免在文件結尾的無限循環。 – chqrlie

0

雖然他的標準不保證在輸入流上使用fflush(),但它在許多Linux/Unix系統上都有文檔記錄和工作。所以以下可能適用於你,但它不是便攜式的:

{ 
    printf("Select the op.: "); 
    fflush(stdin); 
    scanf("%c", &option); 
} 
+0

'fflush(stdin);'未指定。 C標準說它調用未定義的行爲。 – chqrlie

+0

你正在使用哪個編譯器? – Mike

+0

引用C11 7.21.5.2 fflush:*如果流指向輸出流或未輸入最近操作的更新流,則fflush函數會將該流的所有未寫入數據傳遞到主機環境以寫入到文件;否則,行爲是未定義的。*一些編譯器可能會在'fflush(stdin)'上附加特定的行爲,但仍然不是標準的,而且大多數都不合適。此外,你的回答並沒有解決OP的問題。 – chqrlie