- ベストアンサー
C言語にパターンマッチってないの?
パールのようなパターンマッチはできないのでしょうか? 例えば 「1万円で会計を終えました。」 という文字列の中に 「万」 という単語はあるかという処理はできないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
パターンマッチをさせる為の関数が標準関数で用意されています。 文字列の中から、1バイト1文字があるかを探すなら、strchr()で可能です。 文字列の中から、文字列を探す場合、strstr()で可能です。 上記の例の場合、全角で探すので、strstr()を使用する必要があります。 単語があるかないか、という内容の処理で良いのでしたら、strstr()は、パターンマッチしなかった時、NULLポインタを返すので、 char str[32] = "1万円で会計を終えました。"; if ( strstr( str, "万" ) != NULL ) { /* マッチした場合の処理 */ } とすれば良いと思います。
その他の回答 (4)
- SpiralGalaxy
- ベストアンサー率39% (649/1654)
http://www.boost.org/ ここにある正規表現ライブラリを使えば 正規表現によるマッチングが可能です。 ただ、もし扱う文字列が SJIS とかだったら一旦ユニコードに変換かける必要があります。MFCでリンクしたことありますけど、ちゃんと動きますよ。
- 参考URL:
- http://www.boost.org/
- PG_RankB
- ベストアンサー率40% (12/30)
>jacta様 ワイド文字処理のフォロー(と言うか回答)、ありがとうございました^^ マルチバイト文字として処理する方法もありますが、地域性依存があったと思われますので、jacta様の言われる通り、ワイド文字で処理をする方が良いのでしょうかね^^ 文字コードが統一されきれていない今日において(そう簡単では無いのが現状ですが)、どの文字コードを基準に処理を行うかは、いつも頭を悩ませてくれる種です。 DirectXでも、ワイド文字列を入力値とするメソッドが出てきていますし、文字列の扱いに関しては、メモリ管理以外に、文字コードの現状を見ながらの判断が必要ですね。
- jacta
- ベストアンサー率26% (845/3158)
正規表現などではなく、単に文字または文字列を検索するだけならCの標準機能だけでもできます。 ただ、漢字のような多バイト文字を使う場合はちょっと注意が必要なのと、完全な移植性は期待できません。 主要な処理系(の最新版)間で最も高い互換性が維持できる方法としては、次のようなものになるかと思います。 const wchar_t *p = wcschr(L"1万円で会計を終えました。", L'万'); これで、pに「万」の位置を指すポインタが格納されます。(見つからなければNULLです)
- JF1Msf
- ベストアンサー率20% (18/88)
strstrなんていう関数があって、場合によっては使えるかもしれませんが、 Cには正規表現もパターンマッチもありません。 でも、Cでそれらが実現されているわけですから、 自分で頑張って作るなり、 どこからかそんな機能をするプログラムを拝借してくれば、 実現できます。