ああ、プログラマの老朽化した物語。予想以上に何も期待していないコードを徐々に書いていますが、コードは予期せずすべてを正しく行います。このscanf()変換が実際に動作するのはなぜですか?
私はいくつかのCプログラミングの練習問題に取り組んでいますが、stdinをいくつかの行のコードを含むテキストファイルにリダイレクトし、それをscanf()とprintf()でコンソールに出力しました。私は、改行文字を取得するのに問題がありました(scanfは通常空白文字を食べるので)、最初からやり直すことを決めたときに複数の条件文とフラグが混乱してコードが混乱してしまいました。
scanf("%[a-zA-Z -[\n]]", c);
printf("%s", c);
そして、ほら(cは、テキストファイルの内容全体を保持するのに十分な大きさの文字バッファーです)
が、これは完全に働きました。
[\w\W -[\n]]
[\w\d -[\n]]
[. -[\n]]
[.* -[\n]]
[^\n]
なく働いたそれらのどれも私のような、なぜ(外部ブラケットとの間の)文字クラスのバリエーションを作成することによって把握することを試みました。彼らはすべて一人の人物を読んだり、ランダムな人物の混乱を招いたりしてしまった。テキストファイルに改行文字が含まれているため、 '[^ \ n]'は機能しません。したがって、1行だけが出力されます。
私はまだそれを考え出したていないので、私はそこに誰かがこれら二つの質問への答えを知っているだろう願っています:
- をなぜ「[-ZA-Z - [\ NN] ] "期待通りに働く?
- テキストファイルには、文字、数字、記号( ':'、 ' - '、 '>'、多分その他)が含まれています。 'a-z'が "unicode 'a'からunicode 'z' 'へのすべての文字を意味すると仮定すると、' a-zA-Z 'には数字も含まれますか?
- 大括弧の中に入力できるものの構文は、正規表現(私はPythonに精通しています)によく似ていますが、正確ではありません。私はこの問題を解明しようとするのに使うことができるものを読みましたが、この構文が正規表現になるものを比較する情報は見つかりませんでした。だから、どうやって似ていて違うの?
私はおそらくこれを知ってはscanfのための良い使い方ではありませんが、それは練習問題から来ているので、現実の世界大会は、一時的にこの用法では無視する必要があります。
ありがとうございます!
文字の分類形式は正規表現ではありません。読んでください。 [この 'scanf'(および家族)のリファレンス](http://en.cppreference.com/w/c/io/fscanf)を参照してください。 –
"space"から "open bracket"までの範囲の文字列があります。 – user2357112
Cにはネストされた文字クラスがありませんか? – velocirabbit