0

2キー入力すると、「続行するには任意のキーを押してください」が出てきて、さらに2回「Enter」キーを押すと、cmdを閉じる必要がありますが、「Enter」キーを押すと、実行時にポップアップしますチェックの失敗 #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_choicechar. フォーマット指定子"%c"を使用して、charではなくを設定し"%s"ます。フォーマット指定子"%s"は null ターミネータを追加し、メモリに書き込むべきではなく、この場合スタックを破壊します。

ただし、ユーザー入力をasに格納するために asuser_choice2が渡されており、null で終了する文字列が必要です。読み取る最大文字数を指定して、バッファ オーバーランを防止します。atoi()char[]atoi()scanf()

char user_choice2[2];
scanf("%1s", user_choice2);

user_choice2[0]次に、後続のコードでクエリを実行します。

より簡単: where is anintを使用して直接入力します。ユーザーが入力した有効な をチェックするために使用できる、成功した割り当ての数を返します。scanf("%d", &user_choice);user_choiceintscanf()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()、 および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);
    }
}
于 2013-03-28T16:46:51.027 に答える