• 締切済み

CStringの文字列検索&抜き出しについて

お世話になります。 ///////////開発環境/////////// WinXP VisualStudio 2005 SDI MFC 以上の環境にてプログラムしています。 現在CString型の変数の中にある文字列操作について悩んでいます。 例えば、 CString Test(:program!~program@123.456 TEST :message); このような内容が入ってるとします。 こんな時に例えばTESTを抜き出したい時にどうすればいいでしょうか? なお、毎回TESTという文字列ではなくTEST2などの文字列が変わるもの だとするとバイト数指定が出来なくて困っています。 バイト数指定しないでTESTのTのアドレスをGETしてそれを'\0'までを 切り抜くと:messageの部分まで取れてしまいます。 でもバイト指定が可変なので、出来ない・・。どうすればいいのでしょうか?? 同様にmessageの部分も毎回変わっていてバイト数指定出来ません。 こちらの方は、文字列の最後から:を探していって:が見つかったらその アドレスから'\0'までを切り出せばいいと思うのですが、もし messageの部分に:mess:ageこういうメッセージが送られて来た時に、 :ageしか取れなくなり、本当はmess:ageを切り抜きたいのです。 せっかくMFCのCStringを使っているので、strtokやstr~などのC言語関数 は避けたいのですが、何かいい案ありますでしょうか?? ご教示宜しくお願いいたします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

二番目を取り出したいのなら二回検索すればどうでしょう? CStringT::Find (ATL/MFC) http://msdn2.microsoft.com/ja-jp/library/hz2099kw(VS.80).aspx int Find( PCXSTR pszSub, int iStart=0 ) const throw( ); int Find( XCHAR ch, int iStart=0 ) const throw( ); パラメータ pszSub 検索する部分文字列。 iStart 文字列内の検索開始文字のインデックス。 0 にすると、文字列の先頭から検索されます。 ch 検索する 1 文字。 戻り値戻り値 指定した部分文字列または文字と一致した CStringT オブジェクト内の最初の文字を示す、0 から始まるインデックス番号を返します。一致した部分文字列または文字がない場合は -1 を返します。 とりあえず検索してみて、見つかったら見つかった位置+文字列の長さ を開始位置にしてもう一回検索すると。

MON-Q
質問者

お礼

ご回答ありがとうございます。 >とりあえず検索してみて、見つかったら見つかった位置+文字列の長さを >開始位置にしてもう一回検索すると。 とありますが、文字列の長さが毎回違うので、バイト指定できないんですよね・・。 それで、少し思いついたのですが、こんな書き方ではダメですか?? strstrを使ってしまうのですが・・・。 /////////2番目のprogramを抜き出す///////////////// CString test(":program!~program@123.456 TEST :message"); test = strstr(test,"~"); test.Replace('@','\0'); test.Delete(0,1); このやり方で一応取れるのですが、あまり良くないですか??

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

CStringクラスの持っているメソッドのFind と Mid を使う。 CStringT のメンバ (ATL/MFC) http://msdn2.microsoft.com/ja-jp/library/abzc9989(VS.80).aspx CStringT::Find (ATL/MFC) http://msdn2.microsoft.com/ja-jp/library/hz2099kw(VS.80).aspx CStringT::Mid (ATL/MFC) http://msdn2.microsoft.com/ja-jp/library/b4c90k3d(VS.80).aspx

MON-Q
質問者

補足

ご回答ありがとうございます。 CStringT::Find は文字列を検索 CString::Midは文字列の中央を抜き出す という事ですが、例えば上記のに示した感じの文字列の2番目のprogramを 取り出したい時にどのように、記述すれば宜しいのでしょうか? :program!~program@123.456 TEST :message 宜しくお願いいたします

関連するQ&A