10

次のシーケンスが書き込まれるまで、文字列を読み取る必要がありました: \nx\n :

(.....)\n
x\n

\n は改行文字で、(.....) は他の \n 文字を含む任意の文字にすることができます。

scanf は私が知る限り正規表現を使用できますが、このパターンになるまで文字列を読み取ることはできません。scanf フォーマット文字列について教えてください。


私は次のようなことを試みていました:

char input[50000];
scanf(" %[^(\nx\n)]", input);

しかし、うまくいきません。

4

2 に答える 2

23

scanf私の知る限り、正規表現を許可します

残念ながら、正規表現は許可されていません。構文は誤解を招くほど似ていますが、scanf. 正規表現の文字クラスがサポートされているだけなので、%[<something>]暗黙的に として扱われ[<something>]*ます。そのため、 の呼び出しは、scanf以外の文字で構成される文字列を読み取るように変換されます'(', ')', 'x', and '\n'

目の前の問題を解決するために、入力文字を 1 文字ずつ読み取るループを設定できます。を取得するたびに'\n'、それを確認してください

  • これまでに見た入力には、少なくとも 3 つの文字が含まれています。
  • 直前の文字'\n'が ,'x'であること
  • の前の文字'x'が別の文字であること'\n'

上記のすべてが当てはまる場合、予想される入力シーケンスの最後に到達しています。それ以外の場合は、ループを続行する必要があります。

于 2013-03-27T16:57:33.823 に答える
13

scanf 正規表現をサポートしていません。文字クラスのサポートは限られていますが、それはまったく同じではありません。

scanffscanf、またはを使用しないsscanfでください。理由は次のとおりです。

  1. 数値のオーバーフローは、未定義の動作を引き起こします。誰かがあまりにも多くの数字を入力したという理由だけで、C ランタイムがプログラムをクラッシュさせることが許されています。
  2. 一部のフォーマット指定子 (特に%s) は、安全でないのとまったく同じようgetsに安全ではありません。つまり、提供されたバッファの末尾を超えて元気よく書き込み、プログラムをクラッシュさせます。
  3. これらは、不正な入力を確実に処理することを非常に困難にします。

この場合、正規表現は必要ありません。一度に 1 行ずつ読み取り、読み取った行getlineが "x" になったら停止します。ただし、標準 (ISO C ではなく POSIX) の正規表現ライブラリ ルーチンは and と呼ばれregcompますregexec

于 2013-03-27T17:00:00.257 に答える