最近我不得不创建一个程序来重现Monty的问题。我必须让用户在1到3之间选择一扇门,然后随机选择哪扇门背后有奖品。一旦完成,我会向用户展示一扇没有奖励的门,这时他可以选择保留他原来的门,或者改变它。这就是我的问题所在。下面的代码组(我之前已经初始化了所有变量)是当我要求用户保留原门或更改它时。由于一些未知的原因,程序不会等待用户输入他的选择;相反,它会跳过scanf("%c“&)。我不知道这是怎么回事,会不会有人能澄清这种迷思呢?谢谢您:)
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“& skips );被完全忽略,程序跳过到下一部分!
发布于 2014-10-28 22:46:50
问题是,扫描的%c指令读取单个字符的,而不跳过空格。因此,在您的例子中,它将读取在第一个Choose a door问答之后仍然挂在输入上的换行符。您可以使用%1s读取单个非空白字符(忽略所有空格),该字符将跳过左转换行符和用户可能输入的任何空格,返回他们输入的第一个“真实”字符。但是,如果需要这样做,则需要将选择声明为两个字符的数组(char choice[2]),因为扫描将在读取单个字符后写入空字节。
或者,您可以在%c (所以是scanf(" %c", &choice))之前向格式添加一个空格,它显式地跳过所有空白字符。
https://stackoverflow.com/questions/26619436
复制相似问题