8

最大 n 文字の文字列を読み取り、改行文字まで他のものを破棄するために、scanf で正規表現を使用しようとしています。スペースはすべて通常の文字として扱われる必要があるため、読み取られる文字列に含まれます。正規表現に関するウィキペディアの記事を調べましたが、scanf を正しく動作させることができません。ここに私が試したいくつかのコードがあります:

scanf("[ ]*%ns[ ]*[\n]", string);

[ ] は実際の空白文字、* は 1 つ以上を意味し、n は読み取る文字数、string は malloc で割り当てられたポインターです。いくつかの異なる組み合わせを試しました。ただし、文の最初の単語だけを読む傾向があります (スペース文字で停止します)。さらに、* は「ゼロ以上」を意味するのではなく、文字を破棄するようです...

正規表現が scanf によってどのように解釈されるかを詳しく説明できる人はいますか? さらに、代わりに getc を繰り返し使用することは効率的ですか?

前もって感謝します:D

4

3 に答える 3

5

簡単にscanf言えば、文字通り正規表現を処理しません。

C で正規表現を使用する場合は、regex POSIX ライブラリを使用できます。このライブラリの使用法に関する基本的な例については、次の質問を参照してください: C の正規表現: 例?

今、あなたがそれをやりたいのなら、次のscanfようなことを試すことができます

scanf("%*[ ]%ns%*[ ]\n",str);

nin%nsを、入力ストリームから読み取る最大文字数に置き換えます。パーツは%*[ ]スペースを無視するように求めます。を特定の数字に置き換えて*、正確な文字数を無視することができます。中括弧の間に他の文字を追加して、スペース以外を無視することができます。

スペースも%sディレクティブと一致するため、上記の scanf が機能するかどうかはわかりません。
私は間違いなくfgets呼び出しを行い、次のような方法で周囲の空白をトリミングします: 標準的な方法で先頭/末尾の空白を削除するにはどうすればよいですか?

于 2013-02-14T20:38:13.270 に答える
3

代わりに getc を繰り返し使用するのは効率的ですか?

アプリケーションによって多少異なりますが、はい、繰り返すgetc()と効率的です。

于 2013-02-14T20:41:00.310 に答える