- ベストアンサー
カンマで区切った文字の抽出について
環境 WIN98 VC++6.0 MFC にて ”あああ,いい,うえお” のようにカンマで区切った文字列を ”あああ” と ”いい” と ”うえお” のように取り出し変数に格納したいのですが、どのようにすれば良いのでしょうか? MFCの便利な関数があればお教えください。
- みんなの回答 (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 等で必要サイズ確保した 領域にコピーした物を使います。
その他の回答 (2)
- ret
- ベストアンサー率40% (8/20)
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*でポインタ位置をとっているだけなので、 その点は気を付けてください。
お礼
回答ありがとうございます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
strtok()で十分かもしれません。
お礼
回答ありがとうございます。 strtok()で検索したら、大変分かりやすい以下が見つかりました。 http://www9.plala.or.jp/sgwr-t/lib/strtok.html
お礼
回答ありがとうございます。 #1のお礼の欄に書いておきましたサイトでも、同様のことが図解入りで書いてありましたので、大変良く分かりました。