TCHAR文字列内の検索について

このQ&Aのポイント
  • TCHAR文字列内の検索について質問があります。
  • TCHAR型で宣言された変数bufには、「abc,def,ghi」が格納されているとして、結果的にtex1 → "abc" tex2 → "def" tex3 → "ghi"となるようなプログラムを作りたいです。
  • 環境はVisual C++ 2008 Expressで、C言語を使ってプログラミングしています。
回答を見る
  • ベストアンサー

TCHAR文字列内の検索について

TCHAR文字列内の検索について 質問があります。 #include <tchar.h> TCHAR tex1[8]; TCHAR tex2[8]; TCHAR tex3[8]; TCHAR buf[128] = TEXT("abc,def,ghi"); TCHAR型で宣言された変数bufには、「abc,def,ghi」が格納されているとして、 結果的に tex1 → "abc" tex2 → "def" tex3 → "ghi" となるようなプログラムを作ろうと考えています。(buf内をコンマで区切って3つの変数に代入) まずコンマの位置が何文字目にあるか確認するために TCHAR ret[128]; TCHAR search[128] = TEXT(","); ret = _tcschr( buf, search); としてみましたが、やはりうまくいかずにエラーが出ます。 上記の目的を達成するにはどのようなプログラムを作ればよいのでしょうか? 環境はVisual C++ 2008 Expressで、C言語を使ってプログラミングしています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

_tcschrが返すのは、見つかった文字の位置へのポインタであって、実体ではありません。 次のようにすると良いでしょう。 TCHAR buf[128] = TEXT("abc,def,ghi"); TCHAR text1[8] ; TCHAR text2[8] ; TCHAR text3[8] ; const TCHAR *p1, *p2 ; int i ; for (p1 = buf, i = 1 ; i <= 3 ; i++) {   // カンマ検索(あれば、見つかった位置へのポインタ(実体ではない!)を返す)   p2 = _tcschr(p1, _T(',')) ;   // コピーすべき文字数   int len ;   {     // 見つかった(p1からp2の直前まで)     if (p2 != NULL)     {       len = (int)(p2 - p1) ;     }     // 見つからない(残りの文字列全体をコピー)     else     {       len = (int)_tcslen(p1) ;     }   }   // 文字列コピー   switch (i)   {   case 1 :     ::_tcsncpy_s(text1, _countof(text1), p1, len) ;     text1[len] = NULL ;     break ;   case 2 :     ::_tcsncpy_s(text2, _countof(text2), p1, len) ;     text2[len] = NULL ;     break ;   case 3 :     ::_tcsncpy_s(text3, _countof(text3), p1, len) ;     text3[len] = NULL ;     break ;   default :     break ;   } ;   // 次のループの準備   if (p2 != NULL)     p1 = p2 + 1 ;  // カンマの次の文字を指す   else     break ; } _tprintf(_T("%s\n"), text1) ; _tprintf(_T("%s\n"), text2) ; _tprintf(_T("%s\n"), text3) ;

django13
質問者

お礼

まさにやりたかったのはこれです。 参考にさせていただきます。

その他の回答 (4)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

_tcschr()は「文字列中の、指定された文字を示すポインタ(無ければNULL)」を返却するので戻り値を受け取る側はポインタでなければダメです。

回答No.3

確かにretのところもおかしいですね。 TCHAR *ret; にしてみれば?

回答No.2

そこを修正したいのであれば、 TCHAR search = TEXT(','); ret = _tcschr(buf, search);

django13
質問者

補足

回答ありがとうございます。 修正しましたがエラーの内容は変わっていないようです。 retあたりがエラーを起こしているようにも見えます。

回答No.1

_tcschrの2番目の引数は、"文字列"ではなく"文字"を指定します ret = _tcschr(buf, TEXT(','));

django13
質問者

補足

回答ありがとうございます。 確かに一文字なのでシングルでくくらないといけないですね。 修正はしましたがエラーは依然として出るようです。 error C2440: '=' : 'wchar_t *' から 'TCHAR [128]' に変換できません。

関連するQ&A

  • 文字列を配列にしたい

    お世話になります。 PHP4.3.9を利用しているのですが、以下のような文字列を分割して、求める形の配列に入れたいのですが、何か良い方法はありますでしょうか? ■文字列 abc=123&def=456&ghi=789 ■このような形にしたいと思っています↓ $hoge = array(   "abc"=>"123",   "def"=>"456",   "ghi"=>"789" ) ヒントだけでも結構ですので、ご教示いただけると幸いです。宜しくお願いします。

    • ベストアンサー
    • PHP
  • エクセル関数:右側の文字列を抜き出す方法

    エクセル初心者です。 文字列の抜き出す方法で悩んでいます。 たとえば、A1~A5までに下のような 文字列が順に入っているとします。 C:\abc\TEST1.DOC C:\abc\def\TEST2.DOC C:\abc\def\ghi\jkl\TEST3.DOC C:\abc\def\ghi\TEST4.DOC C:\abc\def\TEST5.DOC これらの文字列の一番右側の'\'以降の文字列 (TEST1~5.DOC)を、B1~B5のセルに 出したいと思っているんですが できるのでしょうか? RIGHT関数や、LEN関数、FIND関数を使って できそうな気がするのですが どうも良い方法が思いつきません。 よろしくお願いします。

  • 文字列の検索 集計

    エクセルデータにて     A      B      C 1  ABC    ○○○    XYZ 2  ABC    ○○○    PQR 3  DEF    ×××    XYZ 4  DEF    ×××    PQR 5  DEF    ×××    HIJ *アルファベット、記号は文字列 において、下記形式にしたい場合はどの様な手法がありますでしょうか?     A      B      C 1  ABC    ○○○    XYZ PQR    2  DEF    ×××    XYZ PQR HIJ その際、Cに表示させる方法は、1)連続形式、2)カンマ区切り、3)別列の追加 が考えられると思いますが、どの形式でも構いません。(理想は2ですが) 初心者質問ですが、宜しくお願いします。

  • Perlのキャプチャ

    プログラム #!/usr/bin/perl my $str = "abc,def,ghi"; ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/; print $a,"\n"; print $b,"\n"; print $c,"\n"; 実行結果 abc def ghi このようなプログラムで ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/;は それぞれ$a,$b,$cにabc,def,ghiが入ります. キャプチャしたすべてを変数に入れるならこの方法ですが, defだけが欲しいのに変数を3つ用意する必要がないと思います. 間違った表記ですが, ($b) = $str =~ /(.*),(.*),(.*)/$2/; 2つ目にキャプチャした$2が変数$bに入るような表記は出来ないのでしょうか?

  • 区切り文字を配列に格納する方法を教えて下さい。

    区切り文字を配列に格納する方法を教えて下さい。 $array[] = "abc,1981,1,12"; $array[] = "def,1982,2,18"; $array[] = "ghi,1991,4,12"; list($name[$i],$yy[$i],$mm[$i],$dd[$i]) = split("\,",$array[$i]); でループさせればそれぞれの変数に代入できますが、例えば $name["abc"]["yy"] = "1981"; $name["abc"]["mm"] = "1"; $name["abc"]["dd"] = "12"; のように分解するにはどうすれば良いでしょうか?

    • 締切済み
    • PHP
  • 文字列の括弧について(初心者)

    textに自分で入力した値を変数文字列として扱う場合に、括弧を使いたいのですが、 例 Dim A as string Dim B as string A = Text1.text B = "abc" としてコマンドボタンを押したときにAとBの値が同じ場合(Aがabc)は1をAとBの値が違うときは0を出力するプログラムを作ったのですが、これに追加で括弧()や[]をつけても1を出力するプログラムが作りたいのですが、よくわかりません。 Text1.textの値が(abc)か[abc]でも1を出力、 [ab]cやa(b)cでも1を出力、(abcやa)bc(やa(b(cのときは0を出力するプログラムが作りたいのです。 どうか教えてください。 おねがいします。

  • 文字列スカラを3バイトごとのリスト値にしたい、最後のは3バイトで無くてもいい。

    ある文字列を3バイト毎に配列に入れる書き方がわからず困っております。 $a = "ABCDEFGHIJK" @b = [ABC,DEF,GHI,JK]となって欲しいです。

    • ベストアンサー
    • Perl
  • 正規表現でのパイプ(or)を減らしたいのですが

    いつもお世話になっています。 正規表現のパイプ(|)は非常に遅くなるらしいので、[]内に並べるようにプログラムを修正しようと思っています。それで、 /a|b|c/ ---> [abc] のような方法は、よく紹介されているのですが、a,b,cが単独文字ではなく、単語になっているような場合、 /abc|def|ghi/ ---> [(abc)(def)(ghi)] だと多分ダメですよね(今実行環境が無く確認できません)。 それで、各々の単語を $a = 'abc'; $d = 'def'; $g = 'ghi'; のようにあらかじめ定義しておいて、 /$a|$d|$g/ ---> [$a$d$g] というように書き換えると、うまくいくのでしょうか? やり方が間違っていましたら、ご指摘いただきたく、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Excel(文字列操作)についての質問です。

    今、Excelで、最初の文字とアンダースコアのあとの文字を取り出す方法を考えています。 (例:ABC_DEF_GHI→ADG) しかし、アンダースコアが何個あるかわかりません。 現在、A1セルに、ABC_DEF_GHIと入力されているとき、 =LEFT(A1,1) & MID(A1,FIND("_",A1,1)+1,1) & MID(A1,FIND("_",A1,FIND("_",A1,1)+1)+1,1)・・・・・ と入力すると取得は出来るのですが、アンダースコアの数が変更になると対応できません。 関数、VBAどちらでも結構ですので、よろしくお願いいたします。

  • 文字列をそれぞれテキストに表示する方法(初心者)

    質問:アスキーコードへの変換について VB6(初心者) で質問したものです。 回答してくださったかたありがとうございました。 また質問します、どうかよろしくおねがいします。 文字列を文字ごとに分けてそれぞれテキストやラベルに表示したいのですがどのようなプログラムになるのでしょうか? 例 mojiretu=ABC があるとしてAはtext1にBはtext2にCはtext3にそれぞれ 格納します。 text1.text=A text2.text=B text3.text=C mojiretuは変数文字列とします。 A、B、Cは変数ではなく普通の文字です。 テキストひとつに文字を全部いれるには mojiretu = ABC text1.text = mojiretu でいいと思うのですが、上の例がよくわかりません。 このことが書いてあるサイトでもいいのでどうか教えてくださいおねがいします。

専門家に質問してみよう