正如user_choice2
被传递给isdigit()
我怀疑那user_choice
是一个char
. 使用格式说明符"%c"
填充 a char
,not "%s"
。格式说明符"%s"
将附加一个空终止符,写入不应写入的内存并在这种情况下破坏堆栈。
但是, asuser_choice2
被传递以atoi()
将用户输入存储在char[]
as 中atoi()
需要一个以空字符结尾的字符串。scanf()
通过指定要读取的最大字符数来防止缓冲区溢出:
char user_choice2[2];
scanf("%1s", user_choice2);
然后user_choice2[0]
在后续代码中查询。
int
更简单:使用scanf("%d", &user_choice);
where user_choice
is an直接填充一个int
。scanf()
返回成功分配的数量,可用于检查用户输入的是否有效int
:
if (scanf("%d", &user_choice) != 1)
{
/* Not a valid int, skip input. */
char ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
我可以知道如何防止用户在 int 后面跟着 char 键吗?例如 1a
该格式"%n"
可用于确定处理结束的位置。使用fgets()
and sscanf()
(not scanf()
) 来检测这个无效输入。例如:
char buf[32];
if (fgets(buf, 32, stdin))
{
int value, pos;
if (sscanf(buf, "%d%n", &value, &pos) == 1 &&
pos == strlen(buf) - 1) /* -1 to account for new-line */
{
printf("value=%d\n", value);
}
}