私は(それが動作します)。このコードに出くわし:。...それが動作する理由は?
一般的には機能しません。入力を考えると
は、単一の文字Z
かもしれませんあまりにも多くの失敗例scanf()
がa
を割り当てていないとして、次のコードは、未定義の動作(UB)です。結果:(int)a
はUBです。
scanf("%f",&a);
q=(int)a;
与えられた入力は、「123456789」は、その後、(int)a
に変換int
の範囲外の何かが、また、UBあるかもしれません。
a
の値がINT_MAX
の場合、++q;
はUBです。
入力はint
として正確に表現できますが、float
ではOPのコードが正しくない値です。 "0.99999999999999999999999999999"
のように整数に丸められ
入力 - >1.0f
はOPの検出
代替失敗します。
scanf(), fgets()
はテキストを読み取り、C文字列、int
、float
に変換すると考えるために、代わりになど、より良い、C文字列を読んint
、float
ません。
scanf()
には、という書式の入力が含まれています。これは未知の部分です。避ける方が良いscanf()
。
コードでは、ユーザー入力についてさまざまなことを検出する必要があるため、行のテキストを読むには、fgets()
を使用してください。その後、strtol()
、strtoll()
、strtoul()
などを使用して、入力がターゲットタイプに適合するかどうかを確認します。
// Check if input fits in a `long`
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
puts("End-of-file or input error");
} else {
char *endptr;
errno = 0;
long ivalue = strtol(buf, &endptr, 0);
if (buf == endptr) puts("Fail: no conversion");
else if (*endptr != '\n' && *endptr != '\0') puts("Fail: Extra junk");
else if (errno) puts("Fail: Overlfow");
else printf("Success: %ld\n", ivalue);
}
あなたが値として987654321を入力すると、コードが動作しそうであること。あなたがABCを打つと、それはうまくいかないでしょう。 –
このコードは、入力が「a charまたはstring」であるかどうかは関係ありません。 –
*常に 'scanf'の戻り値をテストします。ここでは' 1'でなければなりません。 'int'を入力してから、1の値が変換されていることを確認し、入力ストリームの次の' char'が空白であることを確認してください。 –