为什么 scanf_s() 在我第二次调用它以验证用户是否提供了正确的输入时不起作用?



我正在编写一个带有菜单的应用程序,我要求用户提供一个表示选项的整数从菜单

1. Option 1
2. Option 2
3. Option 3
...

该选项存储在一个名为

的变量中
option

我想避免错误的输入,例如"12a", "1a2", "我读到这可以通过存储scanf_s()函数的返回值来实现。

所以我把它存储在一个名为 的变量中
ret

,现在我希望每次用户提供错误的输入提示他们输入一个新的值

所以我写了这样的东西:

int ret = scanf_s("%d", &option);
while (!ret)
{
cout << "Provide an integer, not a string! :)n";
ret = scanf_s("%d", &option);
}

问题是,当它进入while时,它不允许用户输入一个新值,因此ret的值永远不会改变,使它无休止地运行。

我如何才能实现我所寻找的?

scanf_s转换整数失败时,违规输入将留在输入流中。再次调用scanf_s("%d", &option)将产生相同的结果,直到从输入流中删除一些字符。还请注意,直接从stdin使用scanf_sscanf容易出错:用户输入的换行符留在输入流中,将被随后对getchar()fgets()的调用读取,可能会导致意外行为。

为了避免这些缺陷,建议使用fgets()一次读取一行,然后将其转换为sscanf():

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
int main() {
char buf[80];
int option;
char cc;
for (;;) {
print_menu();  // output the menu options
if (!fgets(buf, sizeof buf, stdin)) {
/* end of file reached: break from the loop */
break;
}
/* parse exactly one integer with optional leading and trailing whitespace */
if (sscanf(buf, "%d %c", &option, &cc) != 1) {
printf("invalid input: %s", buf);
printf("enter one integer exactlyn");
continue;
}
printf("option is %dn", option);
// handle option
}
return 0;
}

最新更新