2014-10-28 63 views
1

我最近不得不創建一個重新創建Monty Hall問題的程序。我必須要求用戶在1到3之間選擇一扇門。然後,我隨意選擇哪個門後面有獎品。完成後,我會向用戶展示一個沒有獎品的門,此時他可以選擇保留原來的門或改變它。這是我的問題發生的地方。下面的代碼塊(我的所有變量都已經被初始化)是當我要求用戶保留原來的門或者改變它時。由於某些未知原因,該程序不會等待用戶輸入他的選擇;相反,它跳過了scanf(「%c」,&選擇)。我不知道如何發生這種情況,有人能夠澄清這個神祕莫測?謝謝:)scanf正在被跳過:如何讓用戶輸入?

int portes[] = {0,0,0}; 
     srand(time(0)); 
     winning_door= rand()%3; 
     doors[winning_door] = 1; 
     printf("\nChoose a door:\n"); 
     scanf("%d", &chosen_door); 

     for(i = 0; i<3; i++) 
     { 
      if(doors[i] == 0 && i != (chosen_door-1)) 
      { 
       printf("The door number %d is empty!\n", i+1); 
       printf("\nWould you like to change doors? Enter 'y' for yes and 'n' for no.\n"); 
       scanf("%c", &choice); 
       break; 
      } 
     } 

在這段代碼中,scanf函數( 「%C」,&選擇);被完全忽略,程序跳到下一部分!

回答

0

問題是指向scanf的%c指令讀取單個字符而不用跳過空白。所以在你的情況下,它會在第一個問題/答案之後讀取仍然懸掛在輸入上的換行符。您可以使用%1s來讀取單個非空白字符(並忽略所有空白字符),它將跳過剩餘的換行符和用戶可能輸入的任何空白,返回它們輸入的第一個「真實」字符。但是,如果您這樣做,則需要將選項聲明爲包含兩個字符(char choice[2])的數組,因爲scanf將在讀取單個字符後寫入NULL字節。

或者,您可以在%c(因此它將是scanf(" %c", &choice))之前的格式上添加空格,該格式顯式跳過所有空格字符。

+0

謝謝,我能夠正確運行程序! – the1whoknocks 2014-10-28 22:59:04