scanf()
入力を読み取ると仕様通り変換できない場合は、スキャンを停止して変換が成功した回数を返します。あなたの場合、文字は標準入力バッファに残り、scanf()
は0
を返します。
scanf()
は入力を整数に変換できないため、u
は未初期化のため、コードの動作は未定義です。この初期化されていない値をprintf
に渡すと、未定義の動作が発生します。あなたの場合は、多少ランダムな値が出力されますが、これは違うかもしれませんが、クラッシュを含む他の動作が可能です。
変換が成功したかどうかを確認するには、戻り値scanf()
をテストする必要があります。
#include <stdio.h>
int main(void) {
int u, res;
res = scanf("%d", &u);
if (res == 1) {
/* conversion succeeded */
printf("%d\n", u);
} else
if (res == 0) {
/* conversion failed */
printf("input is not a valid number\n");
} else {
/* res must be EOF */
printf("premature end of file: no input given\n");
}
return 0;
}
'scanf'は失敗し、0を返し、コード内の次の文が実行されます。 'scanf'行がなかった場合と同じになります。つまり、初期化されていない変数を印刷しようとすると、あなたのコードは未定義のビヘイビアを呼び出します。 –