为什么这个C程序在while循环后不起作用?

时间:2012-07-14 06:21:41

标签: c

我正在编写一个模拟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语句无关。

2 个答案:

答案 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。 )