我正在编写一个模拟Monty Hall Problem的命令行C程序,但是我的代码的某个部分出现问题,程序只是提示用户输入他们想要打开的数字门,它获取输入并确保它是有效的:
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,它不会崩溃,但在while循环后不会打印所需的输出并继续执行程序。但是,当我输入有效数字时,会打印所选门的名称,这表明它与switch语句无关。
答案 0 :(得分:3)
您正在valid_input
循环范围内隐藏while
:
int valid_input = 0;
while (valid_input == 0) {
// ...
int valid_input = 0; // remove this
}
当您在循环中写入或读取valid_input
时,您正在读取循环中声明的那个,而不是在循环之外。因此,valid_input
你的循环检查实际上永远不会改变。
答案 1 :(得分:1)
如果你想编程,你绝对应该学会使用调试器。这些天大多数编译器都有一个相当不错的编译器。逐步完成代码。你应该能够确定它出错的地方。您也可以了解一些关于代码的其他意外情况。
我无法立即明白为什么循环不会退出给定有效门号的输入。但是,话又说回来,我并不是100%确定在哪里看。
(顺便说一下,我已经创建了" Monty Hall问题的测试程序"。这是真的,这就是为什么:透露其中一扇门,你是提供了有关您未选择的门的其他信息。但是,由于它们永远不会显示您最初选择的门,因此您无法了解该门的任何信息。通过切换,您获胜的几率变为1/2而不是1/3。 )