2014-10-28 49 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