由于user_choice2
被传递给isdigit()
我怀疑user_choice
是char
。使用格式说明"%c"
来填充char
,不"%s"
。格式说明符"%s"
将附加一个空终止符,写入内存不应该是,并在这种情况下破坏堆栈。
然而,如user_choice2
被传递给atoi()
店铺的用户输入在char[]
作为atoi()
需要一个空终止字符串。通过指定的最大字符数,以防止读经由scanf()
溢出缓冲液:
char user_choice2[2];
scanf("%1s", user_choice2);
然后在随后的代码查询user_choice2[0]
。
简单:使用scanf("%d", &user_choice);
直接填充int
其中user_choice
是int
。 scanf()
收益可以用来检查用户做出成功的任务数量输入一个有效的int
:
if (scanf("%d", &user_choice) != 1)
{
/* Not a valid int, skip input. */
char ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
可我知道如何防止用户键入一个INT遵循字符?例如1a
可以使用格式"%n"
来确定处理结束的位置。使用fgets()
和sscanf()
(不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);
}
}
user_choice2是如何定义的? – md5