• ベストアンサー

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

環境 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

  • 文字列の分解

    ”abddfr018874”のようにアルファベットと数字が分かれている文字列において、アルファベット部分と数字部分に分けて取り出したいのですが、そういうことが できる関数は有りますか? 多分無いと思うのですが、そうだとすると1文字ずつ数字かどうかを判断して、分解するしかないのでしょうか? <環境> WIN98 VC++6.0 MFC 

  • 文字列からカンマを取り除きたい

    文字列の中にあるカンマを取り除く関数はないでしょうか? 例) "9,999,999,999.00" ===>> "9999999999.00"

  • 文字列からカンマを取り除きたい

    文字列の中にあるカンマを取り除く関数はないでしょうか? 例) "9,999,999,999.00" ===>> "9999999999.00"

  • [ASP+CSV]カンマ区切りを分解したい!

    こんばんわぁ♪ カンマ区切りの文字列を分解して新しい変数に格納しなおしたいのです・・・。 たとえば・・・。 MOJIRETSU = "12,13,14,15" という文字列を・・・。 a=12 b=13 c=14 d=15 というように分解して新しい変数に。 どのようなコマンドまたは手段を使えばうまくいきますか??

  • [JAVA+CSV]カンマ区切りを分解したい!

    こんばんわぁ♪ カンマ区切りの文字列を分解して新しい変数に格納しなおしたいのです・・・。 たとえば・・・。 MOJIRETSU = "12,13,14,15" という文字列を・・・。 a=12 b=13 c=14 d=15 というように分解して新しい変数に。 どのようなコマンドまたは手段を使えばうまくいきますか??

    • ベストアンサー
    • Java
  • CString型の文字列連結について

    質問させて頂きます。 開発環境はVC++.netです。 CString型の文字列連結について教えて頂きたく。 CString Test[_MAX_FNAME+1]; という変数にがあるとします。 Test変数のデータは Test[0]には"2" Test[1]には"1" が格納されてるとします。 Test変数のデータをCString Text1という変数に 以下のようなソースで文字列連結処理を行ったのですが、だめでした。 何がいけないのでしょうか? for(int i = 0; i <= 2; i++) { Text1 += Test[i]; } 実行結果は Text1には"2"が格納されたままでした。 実際はText1には、"2""1"となってほしい。 分かりにくい説明とは思いますが、 回答、ヒントなどを頂けますでしょうか 宜しくお願い致します。 それと、もしよかったら、Text1の格納データは "2","1"としたいので、カンマ区切りのやりかたなども ヒントを頂けたら幸いです。 以上です。 宜しくお願い致します。

  • 文字列の中のカンマを消したい

    文字列の中にカンマが入っているのを消すのに、適当な関数はないでしょうか? 例) "9,999,999,999.00"  -> "9999999999.00"  

  • 文字取得

    教えてください! fgetsでストリームから文字をline[20]に格納できたとします。 その後、lineから1文字づつ参照していき、 カンマで区切られたデータをそれぞれ別の変数に格納したいのです。 1文字づつ参照するためにはどんな関数でできますか? getcやfgetcではできないと思うのですが・・・。

  • カンマの含まれる文字列の数値変換方法について

    VB.NETでプログラミングしています。 String型の文字列を Double型の数値に変換するときに 一般的にはVal関数を使いますが、 カンマが含まれる文字列"111,111"を 数値変換したい場合には単純にVal関数を 使用しただけではうまくいかないようです。 上の例で数値変換すると"111"になってしまうようです。 そこで質問なのですが、 何か簡単にできるうまい方法はないでしょうか? 関数があればご教示ください。 以下、Val関数の説明の抜粋です。 解説 文字列中に数字以外の文字が見つかると、Val 関数は読み込みを中止します。円記号 (\) やカンマ (,) など、通常は数値の一部と見なされる記号や文字も、Val 関数は数値として解釈しません。

  • ふたつめのカンマと3つ目のカンマの文字列を表示させたい

    こんにちは。表題の件質問させていただきます。 EXCELで、Find関数を使い、カンマ区切のデータ中、最初のカンマが見でくる直前のデータを表示させています =IF(セル番地="","",(LEFT(セル番地,FIND(",",セル番地)-1))) が、表題のように、2番目と3番目のカンマの間の文字列を切り出したい、という場合にFIND関数でできなさそうです。 もし知恵を拝借できれば幸いです。 よろしくお願いいたします

このQ&Aのポイント
  • メールがplalaに受信された添付ファイルがdatの拡張子が付いてファイルを開けることができません。
  • しかし、同じ送信者からのメールがoutlook2010の受信フォルダーの拡張子はdatではなくxlsxで問題なくファイルを開けることができます。
  • この違いは何なのでしょう?
回答を見る

専門家に質問してみよう