2013-03-28 34 views
0

当键入2时,它会出现'按任意键继续'并再按2次'回车'键,它应该关闭但是当按下'enter'键时,会弹出运行时检查失败#2 - 变量'user_choice2'周围的堆栈已损坏。运行时检查失败#2 - 在c编程中围绕变量堆栈

问题在哪里?

这里是代码

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

user_choice2是如何定义的? – md5

回答

1

由于user_choice2被传递给isdigit()我怀疑user_choicechar。使用格式说明"%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_choiceintscanf()收益可以用来检查用户做出成功的任务数量输入一个有效的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); 
    } 
} 
+0

我可以知道如何通过char来防止int中的用户键吗? 例如1a –

+0

我该如何将用户选择结合在一起? –

相关问题