0

我正在编写一个模拟Monty Hall 问题的命令行 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 语句没有任何关系。

4

2 回答 2

3

您正在循环范围valid_input内进行遮蔽:while

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

当您在循环中写入或读取时valid_input,您正在从循环中声明的那个读取,而不是在它之外。所以,valid_input你的循环检查实际上永远不会改变。

于 2012-07-14T06:38:20.623 回答
1

如果你想编程,你绝对应该学习使用调试器。如今,大多数编译器都有一个相当不错的编译器。单步执行您的代码。您应该能够确定哪里出错了。你可能还会学到一些关于你的代码的其他意想不到的东西。

我不能立即明白为什么在输入有效门号的情况下循环不会退出。但是,话又说回来,我不能 100% 确定到底在哪里看。

(顺便说一句,我已经创建了“蒙蒂霍尔问题”的测试程序。这是真的,原因如下:通过揭示其中一扇门,您将获得有关您没有选择的门的额外信息。但是,因为它们永远不会揭示您最初选择的门,您对那扇门一无所知。通过切换,您的获胜几率变为 1/2 而不是 1/3。)

于 2012-07-14T06:31:45.430 回答