2010-11-22 80 views
3

當我試圖使用scanf並獲取,我遇到了麻煩,我需要把獲取兩次,如果我把它一旦我的程序被終止,它的功課,我必須在那些地方使用這些功能。爲什麼我遇到scanf問題並得到?

代碼:

int main() 
{ 
    int i=0,operation=0; 
    char str[100]; 

    printMenu(); 

    scanf("%d",&operation); 

    switch (operation) 
    { 
     case 1:  
      printf("Please, enter your sentence >"); 
      gets(str); 
      gets(str); 

      if (checkChars(str)) 
       inputSent(str); 
      else 
       printf("ERROR: Incorrect data, try again."); 

      break; 
    } 

    return 0; 
} 
+2

什麼可能出問題使用`gets`? – icecrime 2010-11-22 22:22:47

+0

你確定你沒有CheckChars()或inputSent()的麻煩嗎? – GreenMatt 2010-11-22 22:27:57

回答

0

發生了什麼事是後你的第一個scanf()的是,仍然有數據輸入緩衝器(即劃的事情,通常返回任何形式的空白)纏綿,當你呼叫下一個gets()它會立即返回,因爲它讀取了在輸入數字後您點擊的「輸入」。 爲了解決這個問題,你需要刷新輸入緩衝區。這是一個很好的做法,特別是在閱讀個別字符單詞和句子時進行切換這裏有一個小片段,我從另一個線程,可以幫助你發現(這將您scanf()去後):

while (getchar() != EOF);
它的作用,直到沒有剩下不斷讀出的字符輸入緩衝區的。這可能不是所有情況下的最佳解決方案,但它應該足以幫助您完成這項任務。

1

所以,我們有一個stdin數據流。這是您在終端寫入的輸入。

當您撥打scanf時,它只會讀取您寫入的十進制數。它不讀取後面的換行符。因此,您需要撥打gets兩個電話,因爲第一個呼叫只能看到'\n',而第二個看到您的實際數據。

要解決這個問題,我建議您在獲取操作時使用gets讀取完整行,然後使用sscanf獲取操作。

例如:

printMenu(); 

gets(str) 
sscanf(str, "%d", &operation); 

switch (operation) {