2012-07-14 125 views
0

我正在編寫一個模擬Monty Hall Problem的命令行C程序,但我在我的代碼的特定部分遇到問題,程序只是簡單地提示用戶輸入他們想打開的數字門,它獲得輸入並確保它是有效的:爲什麼這個C程序在while循環後不工作?

printf("Please enter the door you would like to choose! (Door 1, 2 or 3)\n\nDoor "); 

char init_input[255]; 

int selection; 
int valid_input = 0; 
while(valid_input == 0) 
{ 
    gets(init_input); 
    int len = strlen(init_input); 
    while(len != 1) 
    { 
     printf("Please choose either door 1, 2 or 3\n\n"); 
     printf("Door "); 
     gets(init_input); 
     len = strlen(init_input); 
    } 
    int valid_input = 0; 
    char input = init_input[0]; 
    switch(input) 
    { 
     case('1'): 
     { 
      selection = 1; 
      valid_input = 1; 
      printf("Door 1\n"); 
      break; 
     } 
     case('2'): 
     { 
      selection = 2; 
      valid_input = 1; 
      printf("Door 2\n"); 
      break; 

     } 
     case('3'): 
     { 
      selection = 3; 
      valid_input = 1; 
      printf("Door 3\n"); 
      break; 


     } 
     default: 
     { 
      printf("\nPlease choose either door 1, 2 or 3\n\nDoor "); 
      break; 
     } 
    } 
} 

printf("\nYou chose Door %d, now I will reveal one of the doors that has a goat behind it:\n\n", selection); 

程序運行正常,直到你輸入任何有效的門數:1,2或3,它不會崩潰,但一段時間後,不打印所需的輸出循環並繼續執行程序。但是,當我輸入一個有效的數字時,會打印出所選門的名稱,這表明它與switch語句無關。

+0

爲什麼不直接輸入一個整數,然後進行驗證檢查,如果是1,2或3以外的值,則讓用戶再次輸入。 – Rndm 2012-07-14 06:27:53

+0

我想使程序白癡證明 - 以便如果用戶輸入的東西以外的整數不會崩潰。 – Harry 2012-07-15 09:45:32

回答

3

你正在遮蔽valid_inputwhile循環範圍:

int valid_input = 0; 
while (valid_input == 0) { 
    // ... 
    int valid_input = 0;  // remove this 
} 

當您寫入或讀取valid_input在循環中,您正在讀取循環中聲明的一個,而不是其外部。因此,您的循環的valid_input實際上不會更改。

+0

非常感謝...不能相信我錯過了!現在我終於可以繼續進行該計劃了... – Harry 2012-07-14 20:07:08

1

如果你想編程,你絕對肯定應該學會使用調試器。現在大多數編譯器都有相當不錯的編譯器。瀏覽你的代碼。你應該能夠確定它出錯的地方。你也可以學習一些關於你的代碼的其他意想不到的事情。

我不能立即明白爲什麼循環不會退出給定輸入的有效門號碼。但是,再一次,我不是100%確切地在哪裏看。這是真的,原因如下:通過揭示其中一個門,你可以獲得關於你沒有選擇的門的其他信息,但是,既然他們永遠不會透露你最初選擇的門,你不會了解那門的任何事情,通過切換,你的勝率變爲1/2而不是1/3)。

+0

我知道 - 目前我正在命令行中使用帶有GCC的文本編輯器,並且知道如何使用它進行調試。每次我嘗試使用IDE(Visual C++,Netbeans,Codeblocks等)時,我都會給出當前方法編譯時出現的錯誤,所以我暫時避免使用IDE,直到我轉向更大的項目。 – Harry 2012-07-15 05:35:05