- 締切済み
トークンで分けた文字列をさらにトークンで分ける
初心者です。よろしければご教授下さい。 temp.c:12: warning: useless keyword or type name in empty declaration というような文字列がg_str02[0]に格納されている時に、まずは「 」(半角スペース)を区切り文字としてトークンごとに分け最初の2つのトークンをmretsu1[0]とmretsu1[1]の中に格納し、さらにmretsu1[0](上記で言う「temp.c:12:」)を「:」を区切り文字としてトークンごとに分けmretsu2[0]とmretsu2[1]に格納するような関数を作りたいのですが、コンパイルは成功するのですが、できた実行ファイルを実行するとエラーが起きて強制終了されてしまいます。 現在ソースは以下のようになっています。 ////////// char mretsu1[255][255]; char mretsu2[2][255]; char *token1 = " "; char *token2 = ":"; strcpy(mretsu1[0], strtok(g_str02[0], token1)); strcpy(mretsu1[1], strtok(NULL, token1)); strcpy(mretsu2[0], strtok(mretsu1[0], token2)); strcpy(mretsu2[1], strtok(NULL, token2)); ////////// デバッグをしてみた所、どうもmretsu1[0]をさらに分解しているところにエラーがあるようです。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- pochi2tama
- ベストアンサー率35% (419/1164)
入力文字列のg_str02[0]は書き換え可能ですか? (これの定義が書かれていないので…) 最初の strcpy(mretsu1[0], strtok(g_str02[0], token1)); でg_str02[0]の中身をstrtokが書き換える(トークン部分を0にして文字列を分割する)ので、このバッファは書き換え可能でなければなりません。 g_str02[0]を、たとえば char buf[255]; strcpy(buf,g_str02[0]); などと安全なバッファにコピーしてから使ってみてはどうでしょうか? あと、質問者さんの使い方であればstrtok()で問題ないと思います。 (strtok関数内のスタティック変数はそれぞれの使用範囲において完結している=検索したい文字列を入れ子にしていないので)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
>「strtok_rは定義されていない関数です。」というエラーが出ました。 お使いのコンパイラがVC++なら、かわりに strtok_s があるはず。
- tsuduki999
- ベストアンサー率35% (6/17)
strtok()は関数の内部に情報を格納しているので 並行して別々の解析をしたい場合は、スレッドセーフな方のstrtok_r()を利用しましょう。 それと、二回目の「:」で解析するときには、文字列(mretsu1[1])のコピーを指定してあげてください。 # strtok()は入力の文字列(str)を変更するので。。。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
空白を区切りとした切り分けが「すべて完了した後」、 各文字列を:で切り分けてみては?
お礼
すべて完了した後にやってみたんですが、同じエラーが出ました。 やはり他の回答者さんがおっしゃられている通り、同じ関数内での処理はできないみたいですね。
お礼
お返事ありがとうございます。 以下のようにソースを変更しました。 ////////// char mretsu1[255][255]; char mretsu2[2][255]; char k_mretsu[255]; char *token1 = " "; char *token2 = ":"; char *save1,*save2; strcpy(mretsu1[0], strtok(g_str02[1], token1)); strcpy(mretsu1[1], strtok(NULL,token1)); sprintf(k_mretsu,"%s",mretsu1[0]); strcpy(mretsu2[0], strtok_r(k_mretsu, token2, *save1)); strcpy(mretsu2[1], strtok_r(NULL, token2, *save2)); ////////// コンパイルしたところ「strtok_rは定義されていない関数です。」というエラーが出ました。 strtok_rは使用したことがないので何とも言えないのですが、これはstrtokと同様のヘッダーファイルに格納されているものなのではないのでしょうか? よろしければ教えて下さい。