2016-06-19 13 views
-2

以下は私のコードの一部です。私は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); 
+0

"これは何ですか?"あなたの好きな[参考文献](http://en.cppreference.com/w/cpp/io/c/fscanf)で容易に入手できます。 – chris

答えて

4

これは割り当ての抑制です。 C11標準から:

%した後、次の順序で表示されます。

  • オプションの割り当て抑制文字*

...

割り当て抑止ない限りa *で示された場合、変換結果は、変換結果を受け取っていないformat引数の後の最初の引数が指し示すオブジェクトに置かれます

したがって、"%*c"の場合、文字がストリームから読み込まれ、破棄されます(このアプリケーションでは改行を破棄していると思います)。

1

あなたは引数を無視したい場合は - 意味解析にそれを、それを保存しないでください - あなたはscanf文字列で*を置くことができます。

%*dは、整数を解析し、それを保存しないでください。
%*c文字(任意の文字、空白である必要はない)を解析しますが、格納しません。

%*c%*c%cから削除することで、最初の文字を無視してinsted変数に代入することはありません。

関連する問題