C while循环部分执行一次额外的迭代

时间:2018-02-21 22:17:08

标签: c while-loop

因此,在运行以下代码后,在第一次迭代时,它会打印出菜单变量并等待几个输入。但是当它进入第二次迭代时,它只是跳过gets()和switch()只打印菜单和空白"输入"变种。但是在第三次迭代时它会表现得合适。 那么为什么它会以这种方式跳过每一次迭代?

int main(void) {
    char menu[] = "1 - run first task\n2 - run se...";
    while (1) {
        char input[20];
        printf(menu);
        gets(input);
        puts(input);
        if (checker1(input))
            switch(input[0]) {
            case ('1'):
                task1();
                break;
            case('2'):
                task2();
                break;
            case('c'):
                system("cls");
                break;
            case('x'):
                return 0;
            }
    }
}

2 个答案:

答案 0 :(得分:0)

即使这个问题已经得到解答,我也意识到你的代码中有很多不专业的东西。

char menu[] = "1 - run first task\n2 - run se...";

开始

即使没有给出大小并立即初始化在C中工作,这也不是一个好习惯,你应该总是定义一个严格的大小,或者动态分配它(使用malloc或calloc)。

其次,您正在使用gets()从控制台读取,这是一件危险的事情,并使您的应用程序容易受到攻击。 gets()被认为是危险的,因为它无法处理大于缓冲区大小的字符串。而且,由于您正在接受用户输入,情况更糟,因为您应该始终考虑用户可能输入他们不应该输入的内容的可能性。 永远不要依靠用户的怜悯。使用fgets从文件或控制台读取,因为您可以定义一次要读取的最大字节数。

第三,在使用switch语句时,以及您想要处理的情况,总是也是一个默认情况。同样的事情,不要指望用户。他们可能会想要输入'1'但是如果他们输入'9'会怎样,如果你没有处理这种情况,你可能会有一些来自应用程序的意外行为。

第四,我在这里看到你的主要目标是让用户决定菜单选项,而不是使用字符串,你可以使用char,而不是gets()fgets(),你可以使用{ {1}}或getch()

以下是代码的修改版本

getchar()

`

答案 1 :(得分:-2)

发布的代码中没有足够的信息来诊断您的问题。请发布MCVE (Minimal, Complete, and Verifiable Example)以获得准确答案。

但是请注意,使用gets()是导致潜在缓冲区溢出的原因,它具有未定义的行为,可能是任何意外结果的解释。

改为使用fgets()并传递目标数组的大小。