2013-03-28 39 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

我該如何將用戶選擇結合在一起? –

相關問題