プロが教えるわが家の防犯対策術!

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言語を使ってプログラミングしています。

A 回答 (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) ;
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/28 09:14

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

    • good
    • 0

確かにretのところもおかしいですね。


TCHAR *ret;
にしてみれば?
    • good
    • 0

そこを修正したいのであれば、



TCHAR search = TEXT(',');

ret = _tcschr(buf, search);

この回答への補足

回答ありがとうございます。

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

補足日時:2010/06/27 08:27
    • good
    • 0

_tcschrの2番目の引数は、"文字列"ではなく"文字"を指定します



ret = _tcschr(buf, TEXT(','));

この回答への補足

回答ありがとうございます。
確かに一文字なのでシングルでくくらないといけないですね。

修正はしましたがエラーは依然として出るようです。
error C2440: '=' : 'wchar_t *' から 'TCHAR [128]' に変換できません。

補足日時:2010/06/27 00:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています