因此,在运行以下代码后,在第一次迭代时,它会打印出菜单变量并等待几个输入。但是当它进入第二次迭代时,它只是跳过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;
}
}
}
答案 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()
并传递目标数组的大小。