2013-05-08 195 views
0

,所以我有這樣的代碼,這是應該從用戶那裏獲取座標內:scanf的while循環工作只有一次

#include <stdio.h> 
#include <time.h> 

int main() { 
int number; 
char letter; 
int points = 3; 
    while(points < 8){ 
     printf("give me first coordinate (letter)"); 
     scanf("%c",&letter); 
     printf("give me second coordinate (number)"); 
     scanf("%d",&number); 
    } 
} 

據我所知,這應該不斷從用戶取座標,而是它只需要一次,然後以一種非常奇怪的方式粉碎,就像沒有任何理由地跳過scanf一樣。這裏是我的輸出:

give me first coordinate (letter)a 
give me second coordinate (number)1 
give me first coordinate (letter)give me second coordinate (number)12 
give me first coordinate (letter)give me second coordinate (number)df 
give me first coordinate (letter)give me second coordinate (number)give me first coordinate (letter)give me second coordinate (number)sss 

我覺得真的很困惑,因爲這是簡單的代碼,我沒有slightes想法什麼導致此。任何人?(如果它有什麼區別,我的系統是山獅)

+4

想想你如何處理出現在輸入新行

這也適用。提示:你現在沒有處理它們。 – 2013-05-08 18:36:18

+0

您忽略了輸入操作的結果。這是一個致命的編程錯誤。 – 2013-05-08 18:39:28

+0

@KubaPolaczek錯誤是由所有......但你將如何避免在未來犯這個錯誤?在我看來,這個問題主要是關於'scanf'。我首先仔細閱讀'scanf'手冊,一遍又一遍,直到我理解了所有這一切......爲了將來的參考,opengroup給出了C標準庫函數的一個很好的描述。您可以通過搜索「opengroup scanf」找到opengroup scanf手冊。 – Sebivor 2013-05-08 19:01:04

回答

5

一個可能的解決方案是增加一個空間來跳過空白:

scanf(" %c",&letter); 
    ^

隨着用戶「未定義行爲」正確指出的那樣,你也應該檢查返回值。在這種情況下,如果返回值<0那麼您不能再從stdin讀取並且返回值小於您正在閱讀的項目數,則您希望返回值等於您正在閱讀的項目數量,有轉換錯誤。

+1

確保您檢查返回值。負值表示「stdin」不能再被讀取,並且任何小於期望讀取的項目數的返回值(在本例中爲1)表示發生了轉換錯誤(例如,由@VX如下:「*如果你輸入」a「到scanf(」%d「,&i),你永遠不會得到任何結果...... *」) – Sebivor 2013-05-08 18:57:17

+0

@undefinedbehaviour好點,修改我的答案 – 2013-05-08 19:07:27

-1

我個人不喜歡使用scanf。該函數將輸入流保留在它看起來不太明確的狀態。 我喜歡與fgets與sscanf的結合...

+0

如果你以正確的方式使用它,那麼它沒有問題。 – Devolus 2013-05-08 18:44:20

+0

如果你輸入「a」到scanf(「%d」,&i),你永遠不會得到任何結果...... – 2013-05-08 18:46:45

+0

@ V-X這取決於你是否閱讀手冊*。 – Sebivor 2013-05-08 18:54:15

2
scanf(" %c",&ch); 

這個工作的原因是第一個空格刷新stdin然後讓用戶輸入字符。如果你把/n/t之前%c