user_choice2
に渡されているので、isdigit()
それuser_choice
はchar
. フォーマット指定子"%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_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 の後に 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);
}
}