の戻り値を確認してくださいscanf
。正常に一致して割り当てられたアイテムの数が返されます。この場合、文字列を入力すると、一致して割り当てられませんが、文字列は入力バッファーに残り、 はscanf
反復ごとに読み取ろうとして失敗するため、問題が発生します。
コードを次のように変更できます。
int main () {
int secret, answer;
srand((unsigned)time(NULL));
secret = rand() % 10 + 1;
do {
printf ("Guess a number between 1 and 10");
if (scanf ("%d",&answer) != 1)
{
printf ("\nPlease enter an integer\n\n");
scanf ("%*s");
continue;
}
if (secret<answer) puts ("Guess a higher value");
else if (secret>answer) puts ("Guess a lower value");
} while (secret!=answer);
puts ("Congratz!");
return 0;
}
if
行の内側scanf ("%*s");
で行われることに注意してください。は入力抑制インジケータであり%*s
、*
これは文字列 ( の略%s
) が読み取られることを示しますが、*
は文字列が入力から読み取られるが破棄されることを示します。これは、 によって読み取られない、以前に入力された文字列を単純に破棄するために行われていますscanf ("%d",&answer)
。バッファ内の文字列を破棄しない場合、文字列は残り、scanf ("%d",&answer)
入力バッファ内の残りの文字列に遭遇するため、各反復は整数との一致に失敗します。
一方、文字列を読み取り、文字列を整数に変換することもできます。
以下のように:
int main () {
int secret, answer;
char buff[128];
srand((unsigned)time(NULL));
secret = rand() % 10 + 1;
do {
printf ("Guess a number between 1 and 10");
scanf ("%s",buff);
if ((answer = atoi (buff)) == 0)
{
printf ("\nPlease enter an integer\n\n");
continue;
}
if (secret<answer) puts ("Guess a higher value");
else if (secret>answer) puts ("Guess a lower value");
} while (secret!=answer);
puts ("Congratz!");
return 0;
}
atoi ()
文字列を整数 (10 進数) に変換します。整数を構成する文字に有効な数字が含まれていない場合は、 が返され0
ます。それをチェックすることで、ユーザーが正しく入力したかどうかを検出できます。また、アプリケーションでは 1 から 10 までの整数を入力する必要があるため、0 は含まれないため、0 を無効としても問題ありません。無効な整数形式の検出と、文字列内のエラーの場所をより適切に制御するには、次を使用します。strtol ()