2017-01-19 43 views
0

我正在完成一項任務,完成後有1個錯誤和1個錯誤修復程序,因此我沒有完全理解。目前,只要用戶做了什麼要求,一切正常。但我知道這並不經常發生,所以我很想知道如何阻止這些問題。 很想任何意見 - 我是一個完整的初學者與C在for循環中的C - scanf()正在導致printf()運行多次

我發現很多不同點建議在這裏:C: Multiple scanf's, when I enter in a value for one scanf it skips the second scanf

我添加了一個空間,我的scanf(),它解決了一些蟲子的語句 - 和我知道\ n被添加到輸入的字符串/字符的末尾,我只是不知道如何檢查它/處理它,並且我嘗試使用getchar()代替scanf(),但我仍然得到雙打印/循環問題。

錯誤版本

當用戶通過遊戲循環運行時,如果它們進入多於1個字符(例如:「OO」,當與scanf的提示()來輸入「Y」或「N」)我的printf語句運行1X每個字符的輸入,並連接到對方:

例子是:

歡迎兩扇門。

你想玩嗎? (年/月):歡迎來到兩扇門。

你想玩嗎? (y/n):

如果用戶輸入'y'來玩遊戲,但在第二部分輸入的字符不是1,2或3,那麼這個問題也會出現。

我該如何限制他們回覆的長度?或者是在輸入if語句之前監控比賽時間和選擇變量的最佳方式?也許檢查,看看他們是否超過1個字符,如果是,只採取第一個字符?

第二個問題 - 我不明白的錯誤修復 在scanf()函數中,我碰到了一個和我上面描述的類似的問題,但是當用戶輸入任何字符時發生了這種情況。我找到的解決方案是在字符前加一個空格 - >

scanf(" %c", &play); 

VS

scanf("%c", &play); 

是這個問題只有一個問題,使用循環什麼時候?因爲在循環代碼之前我從未發現這些錯誤。

用'while(getchar()!='\ n')更新代碼;''從Sourav戈什

#include <stdio.h> 

int main(void) { 

    char play; 
    int choice; 
    char answer[] = "No matter which one you choose the guards both tell you which door leads to death, and therefore you can pick the other door.\n"; 
    int gameLoop = 1; 
    int timesPlayed = 0; 

    while (gameLoop == 1){ 

     if (timesPlayed == 0) { 
      printf("Welcome to Two doors.\n"); 
      printf("Would you like to play? (y/n):"); 
     } else { 
      printf("Would you like to play again? (y/n):"); 
     } 
     scanf(" %c", &play); 
     while (getchar() != '\n'); 

     if (play == 'y') { 
      // == instead of = 
      printf("\nYou are a prisoner in a room with 2 doors and 2 guards.\n"); 
      printf("One of the doors will guide you to freedom and behind the other is a hangman --you don't know which is which.\n"); 
      printf("One of the guards always tells the truth and the other always lies. You don't know which one is the truth-teller or the liar either.\n"); 
      printf("You have to choose and open one of these doors, but you can only ask a single question to one of the guards.\n"); 
      printf("What do you ask so you can pick the door to freedom?\n\n"); 
      printf("\t1.Ask the truth-guard to point to the door of doom.\n"); 
      printf("\t2.Ask the liar-guard to point to the door of doom.\n"); 
      printf("\t3.Doesn't matter which one you pick.\n"); 
      scanf(" %d", &choice); 
      while (getchar() != '\n'); 

      switch (choice) { 

       case 1: 
       printf("%s", answer); 
       timesPlayed++; 
       break; 

       case 2: 
       printf("%s", answer); 
       timesPlayed++; 
       break; 

       case 3: 
       printf("%s", answer); 
       timesPlayed++; 
       break; 

       default: 
       printf("The Troll Smasher comes out from the shadows and squeezes the stupid out of you until you pop. GAME OVER!\n"); 
       break; 
      } 
     } else if(play == 'n') { 
      printf("Sorry to hear that, we at Two Doors hope you have a super duper day!\n"); 
      gameLoop = 0; 
      break; 
     } else { 
      printf("That is not a valid input, please try again by entering either 'y' to start the game or 'n' to quit the game.\n"); 
     } 
    } 
    return 0; 

} 

回答

0

問題建議與%c格式說明的是,它將從輸入緩衝區只讀一個字節,如果輸入緩衝器有更多的商店,在遇到下一次調用,它將不會要求用戶輸入,它會簡單地從可用輸入流中讀取下一個字節。

因此,要回答

如何限制他們的響應的長度?

好,有沒有,你可以進入停止用戶立刻方法只X字符/數字,而是刷卡掉多餘的,(如有),併爲下一個呼叫,開始與空的緩衝區是一個簡單的方法。

因此,快速解決這個問題的方法是清除剩餘輸入的標準輸入。你可以這樣做

int retval = scanf(" %c", &play); 

    //some code 

    while (getchar() != '\n'); //eat up the input buffer 

    //next call to scanf(), input buffer is empty now.... 

從閱讀已有不需要輸入停止scanf(),迫使它從用戶的要求輸入。

另外,不要忘記檢查返回值scanf()以確保通話成功。

+0

我更新了我的文章中的代碼以使用您的建議。我是否正確使用它?我測試了所有的錯誤,他們似乎都解決了。這條線是否實現了多個目標?防爆。如果播放持有'\ n'值,則代碼無法執行;如果該值爲true,則清空輸入緩衝區?因爲它還修復了多個條目ooo(當有除\ n以外的其他字符\ n –

0

對於第一個問題,問題是由於程序的執行再次進入循環引起的,例如,如果用戶輸入oo,意味着在用scanf讀取之後它將一直到最後一個。 其中沒有一個變量被修改,所以當它重新進入循環時,gameLoop仍然是1,timesPlayed仍然是0,因此它會在第一個if中打印語句,然後scanf將讀取第二個o並重復該過程。問題是scanf當時讀取一個字符。

+0

謝謝安迪 - 這肯定幫助我理解了循環 –

0

實際上,對於輸入一個字符,您可以使用getchar(),但在字符輸入後的任何情況下,您都應該清理標準輸入流。考慮下面的例子中,強制用戶正確輸入:

char name[11]; 
    char answer = 0; 
    printf("Would you like to play again? (y/n): "); 
    while ((answer = getchar()) != 'y' && answer != 'n') 
    { 
     printf("You should answer 'y' or 'n'\n"); 
     // clean the buffer from mess 
     while (getchar() != '\n'); 
    } 
    // clean the buffer from mess 
    while (getchar() != '\n'); 
    // next input 
    printf("Enter your name: "); 
    scanf("%10s", name); 
    // clean the buffer from mess 
    while (getchar() != '\n'); 

UPDATE:

只是爲了澄清,代碼

while ((answer = getchar()) != 'y' && answer != 'n') 
{ 
    printf("You should answer 'y' or 'n'\n"); 
    // clean the buffer from mess 
    while (getchar() != '\n'); 
} 

可以更容易理解,同時改寫as

char name[11]; 
char answer = 0; 
printf("Would you like to play again? (y/n): "); 
while (1) // infinit loop 
{ 
    answer = getchar(); 
    // clean the buffer from mess (immideatly after reading) 
    while (getchar() != '\n'); 
    if (answer == 'y' || answer == 'n') // check the input 
     break; // stop the loop if condition is true 
    // or ask again 
    printf("You should answer 'y' or 'n'\n"); 
} 
// next input 
printf("Enter your name: "); 
scanf("%10s", name); 
// clean the buffer from mess 
while (getchar() != '\n'); 

i ñ我的第一個例子,我只是優化代碼while之後組合的閱讀和檢查括號中的數據:(answer = getchar()) != 'y'就像兩個動作 - answer = getchar()然後answer != 'y'

在過去的片斷條件answer != 'y' && answer != 'n'故意用answer == 'y' || answer == 'n'更換,以顯示之間的「差異當數據不正確「和」當正確的數據得到時停止「

+0

感謝你們,我喜歡立即處理錯誤的輸入,不知道如何重新輸入(我最初的嘗試是將它們發送迴游戲開始)你能解釋爲什麼getchar()會在printf(「你應該回答'y'或'n'\ n「);它是否經常循環,因爲我們設置了getchar()的初始while語句,然後在輸入y或n之前不允許它跳過? –

+0

謝謝澄清!這對我有很大的幫助。 –