web-dev-qa-db-ja.com

scanf形式指定子のアスタリスクはどういう意味ですか?

だから私はこのコードに出くわしました、そして私はそれの目的が何であるか、またはそれがどのように機能するかを理解することができませんでした:

int Word_count;
scanf("%d%*c", &Word_count);

私が最初に考えたのは、%*dcharポインターを参照しているか、Word_countchar変数を取得できないようにしているということでした。

誰かがこれに光を当ててくれませんか?

28
Joel

*cは、文字が読み取られるが割り当てられないことを意味します。たとえば、入力「30a」の場合、Word_countに30が割り当てられますが、「a」は無視されます。

21
Viktor Simkó

* in "%*c" を意味する assignment-suppressing character *このオプションが存在する場合、関数は変換の結果を受信引数に割り当てません。1 したがって、文字は読み取られますが、変数には割り当てられません。


脚注:

1. fscanf

23
BeyelerStudios

C11標準を引用するには、§7.21.6.2章、fscanf()

[...]各変換仕様は、文字%によって導入されます。 %の後に、次のように順番に表示されます。

—オプションの代入抑制文字*
— [...]
変換指定子文字

行動に関しては、

[..]割り当ての抑制が*で示されていない限り、変換の結果は、変換結果をまだ受け取っていないformat引数に続く最初の引数が指すオブジェクトに配置されます。 [...]

つまり、"%*c"のようなフォーマット指定子の場合、charstdinから読み取られますが、スキャンされた値は保存されず、何にも割り当てられません。したがって、対応するパラメーターを指定する必要はありません。

したがって、この場合、

scanf("%d%*c", &Word_count);

完全に有効ステートメントです。

たとえば、* nix環境で行うことは、を押したために保存されたnewlineから入力バッファをクリアすることです。 ENTER 入力後のキー。

12
Sourav Ghosh