scanf関数って、意外に奥が深い。代入抑止文字とか便利そう。
引用サイト
●入力変換仕様
フォーマット指定子だけでも知っていれば最低限のことができます。しかし、scanf関数の機能はこれだけではありません。フォーマット指定の正確な書式は、次のようになっています。
%[代入抑止文字][最大フィールド幅][変換修飾子]フォーマット指定子
[]の部分は省略可能です。[]の付いていない部分だけを取り出すと、
%フォーマット指定子
となります。これが最小の形なのです。
●代入抑止文字
「代入抑止文字」は * を書くか書かないかだけです。書いた場合、入力の受け付けを禁止できます。例えば、次のように使います。
scanf( "%d%*c%d", &num1, &num2 );
この場合、1つ目の整数入力後にある、文字の入力は変数に格納されることがありません。格納されないだけで入力は行います。だから、この場合に、次のように入力されると、
100a200
'a'はどこにも格納されることがありません。この機能は、電話番号や郵便番号の入力等に便利です。
●最大フィールド幅
「最大フィールド幅」は、入力される最大のバイト数を指定します。これまでにも文字列の入力のときに使ったことがあります。
scanf( "%80s", str );
このようにすると、80バイトまでしか入力を受け付けません。81バイト目からは、次の引数に受け継がれます。
●変換修飾子
「変換修飾子」には、「h」「l」「L」のいずれかを指定できます。
これらは定数に付けるサフィックスやプリフィックスと同じ意味です。「h」はshort、「l」はintや unsingedに対するlong、「L」はdoubleに対するlongの指定です。フォーマット指定子の指定と一致しない場合は、正しい動作を保証しません。
引用サイト
●入力変換仕様
フォーマット指定子だけでも知っていれば最低限のことができます。しかし、scanf関数の機能はこれだけではありません。フォーマット指定の正確な書式は、次のようになっています。
%[代入抑止文字][最大フィールド幅][変換修飾子]フォーマット指定子
[]の部分は省略可能です。[]の付いていない部分だけを取り出すと、
%フォーマット指定子
となります。これが最小の形なのです。
●代入抑止文字
「代入抑止文字」は * を書くか書かないかだけです。書いた場合、入力の受け付けを禁止できます。例えば、次のように使います。
scanf( "%d%*c%d", &num1, &num2 );
この場合、1つ目の整数入力後にある、文字の入力は変数に格納されることがありません。格納されないだけで入力は行います。だから、この場合に、次のように入力されると、
100a200
'a'はどこにも格納されることがありません。この機能は、電話番号や郵便番号の入力等に便利です。
●最大フィールド幅
「最大フィールド幅」は、入力される最大のバイト数を指定します。これまでにも文字列の入力のときに使ったことがあります。
scanf( "%80s", str );
このようにすると、80バイトまでしか入力を受け付けません。81バイト目からは、次の引数に受け継がれます。
●変換修飾子
「変換修飾子」には、「h」「l」「L」のいずれかを指定できます。
これらは定数に付けるサフィックスやプリフィックスと同じ意味です。「h」はshort、「l」はintや unsingedに対するlong、「L」はdoubleに対するlongの指定です。フォーマット指定子の指定と一致しない場合は、正しい動作を保証しません。