違いは (明らかですが) フォーマット文字列が異なることです。次の行を入力した場合:
"3 "
scanf()
正常に戻ります。それ以外の場合は、提供された入力に依存します。scanf()
基本的に、空白 (タブ、スペース、改行) をスキップし、入力ストリームで英数字の値を検索します。これは末尾の空白であるため、 を押すと入力の最後にある末尾の改行文字と一緒にまとめられ、ENTERほとんど影響がありません。
scanf()
は、連続する空白文字が単一の空白文字に圧縮されることを除いて、提供された入力が、提供されたフォーマット文字列と正確に一致することを期待しています。これは、文字列処理に相当するsscanf()
.
これをさらにテストするための良い演習は、次のようになります。
#include<stdio.h>
int main(void)
{
int a=0,b=0,c=0;
printf("Enter values for A, B, C, in the format: \"A B - C\"\n");
scanf("%d %d - %d", &a, &b, &c);
printf("Values: A:%d, B:%d, C:%d\n", a, b, c);
}
その後、正しい形式と正しくない形式のコンソール入力 (つまり、スペースとハイフン) の両方を提供した後、これらの整数の値を確認してください。いくつかの実行例を次に示します。1 つ目は間違った入力を使用し、2 つ目は正しい形式の入力を使用しました。最初のケースでは、入力とフォーマット文字列が一致しない場合に予期しない動作が発生するC
ため、設定さえされないことに注意してください。scanf()
一般にfgets()
、ユーザーから入力の文字列を取得するようなものを使用してから、さまざまな検索関数 (つまり、strstr()、strch()、strcat、strcpy など) を使用して文字列を解析することをお勧めします。scanf()
ユーザーが誤ってまたは意図的に間違いを犯さないと仮定して使用するよりもはるかに安全です。
Enter values for A, B, C, in the format: "A B - C"
1 2 3
Values: A:1, B:2, C:0
Enter values for A, B, C, in the format: "A B - C"
1 2 - 3
Values: A:1, B:2, C:3
ここで、最後の実行を 1 つ考えてみましょう: がscanf()
複数の連続する空白文字を 1 つの文字に圧縮することがわかります。したがって、これらの最終的な実行が実際に成功する理由は次のとおりです。
Enter values for A, B, C, in the format: "A B - C"
1 2 - 3
Values: A:1, B:2, C:3
Enter values for A, B, C, in the format: "A B - C"
1 2 - 3
Values: A:1, B:2, C:3