1

入力として文字列を取得し、スペース、ハイフン、数字以外のものをすべて破棄する必要があります。言い換えれば、正と負の整数のみを読み込む必要があります。scanf の使用に行き詰まっているわけではありませんが、それを好むでしょう。

私がこれまでに試したことは次のとおりです。

char buffer[200];

scanf("%[0-9 ' ']*%c", buffer); /*this works perfectly, except the hyphen part*/
scanf("%[0-9 - ' ']%*c", buffer); /*no change*/
scanf("%[0-9 '-' ' ']%*c", buffer); /*still no change*/

明らかに、一度に1つだけ試しました。

あなたが提供できる洞察や助けに感謝します。

4

1 に答える 1

0

私はこれがあなたのために働くことに驚いています:

scanf("%[0-9 ' ']*%c", buffer);
                 ^--- There's a typo, here. The * should probably be after the %.

もっと差し迫った問題に... C11標準では、セクション§7.21.6.2p12で、[変換指定子の下に説明するいくつかの文があります:

- 文字が scanlist にあり、最初の文字でも、最初の文字が ^ である 2 番目の文字でも、最後の文字でもない場合、動作は実装定義です。

その結果、次の 2 つのことを提案します。

  1. 0-9スキャンセット内の文字の範囲を移植可能に表現することに頼ることはできません0123456789。と明示的に述べた方がよいでしょう0123456789
  2. あなたの実装は-、あなたが望むように解釈していません。

私は次のようなことを提案します:

assert(scanf("%[- 0123456789]%*c", buffer) == 1);

戻り値を確認する必要があります。scanfが 0 または を返す場合EOF、 を使用して明確に定義されたものは期待できませんbuffer。を-スキャンセットの先頭に配置して、明確に定義し、前述のようにに展開0-90123456789ました。

それが役立つことを願っています:)

于 2013-04-27T17:52:08.423 に答える