以下は私のコードの一部です。私は3つの変数、すなわちc、lとrを入力したいと思います。しかし、scanfステートメントから%* cを削除すると、ループは必要な回数実行されず、その前に終了します。それはなぜそうですか? %* cは何をしますか?C++パーセント記号の後のアスタリスク
scanf("%d", &Q);
for (i = 0; i < Q; ++i) {
scanf("%*c%c%d%d", &c, &l, &r);
以下は私のコードの一部です。私は3つの変数、すなわちc、lとrを入力したいと思います。しかし、scanfステートメントから%* cを削除すると、ループは必要な回数実行されず、その前に終了します。それはなぜそうですか? %* cは何をしますか?C++パーセント記号の後のアスタリスク
scanf("%d", &Q);
for (i = 0; i < Q; ++i) {
scanf("%*c%c%d%d", &c, &l, &r);
これは割り当ての抑制です。 C11標準から:
%した後、次の順序で表示されます。
- オプションの割り当て抑制文字*
...
割り当て抑止ない限りa *で示された場合、変換結果は、変換結果を受け取っていないformat引数の後の最初の引数が指し示すオブジェクトに置かれます
したがって、"%*c"
の場合、文字がストリームから読み込まれ、破棄されます(このアプリケーションでは改行を破棄していると思います)。
あなたは引数を無視したい場合は - 意味解析にそれを、それを保存しないでください - あなたはscanf
文字列で*
を置くことができます。
%*d
は、整数を解析し、それを保存しないでください。
%*c
文字(任意の文字、空白である必要はない)を解析しますが、格納しません。
%*c
を%*c%c
から削除することで、最初の文字を無視してinsted変数に代入することはありません。
"これは何ですか?"あなたの好きな[参考文献](http://en.cppreference.com/w/cpp/io/c/fscanf)で容易に入手できます。 – chris