• ベストアンサー

カンマで区切った文字の抽出について

環境 WIN98 VC++6.0 MFC にて ”あああ,いい,うえお” のようにカンマで区切った文字列を ”あああ” と ”いい” と ”うえお” のように取り出し変数に格納したいのですが、どのようにすれば良いのでしょうか? MFCの便利な関数があればお教えください。

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

  • ベストアンサー
  • BILLY-J
  • ベストアンサー率57% (60/105)
回答No.3

先の方達の回答に補足します。 strtok で要件を満しますし、私も strtok 使うと思います。 ただ、これちょっと癖が有ります。 strtok は走査したバッファの内容を書き換えてしまいます。 例えば   char* pszToken = NULL;   char szBuff[] = "あああ,いい,うえお"; (実際は終端 \0 が在り "あああ,いい,うえお\0" となっている)   pszToken = strtok(szBuff, ","); この時 szBuff の内容は "あああ\0いい,うえお\0" となり、 pszToken は "あああ" の部分の先頭を指します。 (szBuff の0バイト目)   pszToken = strtok(NULL, ","); 第1引数 NULL は前回の strtok の続きをやる、という意味です。 2回目で szBuff の内容は "あああ\0いい\0うえお\0" となり、 pszToken は "いい" の部分の先頭を指します。 (szBuff の7バイト目)   pszToken = strtok(NULL, ","); 3回目は szBuff の内容が "あああ\0いい\0うえお\0" のままです。 (元々在った終端 \0 に上書きしているのかも知れませんが) pszToken は "うえお" の部分の先頭を指します。 (szBuff の12バイト目)   pszToken = strtok(NULL, ","); 4回目は szBuff の内容は変わらず、 pszToken には NULL が返ります。 (#2さんのように、これで切り分け処理終了のロジックを書きます) なので、元々の szBuff[] = "あああ,いい,うえお" というデータを 後でまた使いたい可能性が有るなら、strtok には別領域にコピーした 物を渡すようにしましょう。 尚、対象となるデータを CString で保持している場合は、そのまま では渡せないので GetBuffer で内容書き換え可能なポインタを取得 するか、充分な大きさの char 配列や new 等で必要サイズ確保した 領域にコピーした物を使います。

VitaminBB
質問者

お礼

回答ありがとうございます。 #1のお礼の欄に書いておきましたサイトでも、同様のことが図解入りで書いてありましたので、大変良く分かりました。

その他の回答 (2)

  • ret
  • ベストアンサー率40% (8/20)
回答No.2

strtokで char* p; char a[] = "あああ,いい,うえお"; char*b[3]; int i = 0; for( p = strtok(a, ","); p != NULL; p = (strtok(NULL, ",")) ){ b[i] = p; i++; } で、いいだけでは?。 char*でポインタ位置をとっているだけなので、 その点は気を付けてください。

VitaminBB
質問者

お礼

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

回答No.1

strtok()で十分かもしれません。

VitaminBB
質問者

お礼

回答ありがとうございます。 strtok()で検索したら、大変分かりやすい以下が見つかりました。 http://www9.plala.or.jp/sgwr-t/lib/strtok.html

関連するQ&A