0

输入2时会出现“按任意键继续”,再按2次“enter”键,应该是关闭cmd,但是当按“enter”键时,会弹出run-time检查失败 #2 - 变量“user_choice2”周围的堆栈已损坏。

问题出在哪里?

这是代码

do{

    printf("Please key in your choice (1 to start , 2 to exit)\n>>");
    scanf("%s", &user_choice2);
    if (!isdigit(user_choice2))
    {
        printf("");
    }

}
while (!isdigit(user_choice2));
user_choice = atoi(&user_choice2);
4

1 回答 1

1

正如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_choiceis an直接填充一个intscanf()返回成功分配的数量,可用于检查用户输入的是否有效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);
    }
}
于 2013-03-28T16:46:51.027 回答