初心者です。よろしければご教授下さい。
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]に格納するような関数を作りたいのですが、コンパイルは成功するのですが、できた実行ファイルを実行するとエラーが起きて強制終了されてしまいます。
現在ソースは以下のようになっています。
//////////
charmretsu1[255][255];
charmretsu2[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]をさらに分解しているところにエラーがあるようです。
よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
strtok()は関数の内部に情報を格納しているので
並行して別々の解析をしたい場合は、スレッドセーフな方のstrtok_r()を利用しましょう。
それと、二回目の「:」で解析するときには、文字列(mretsu1[1])のコピーを指定してあげてください。
# strtok()は入力の文字列(str)を変更するので。。。
参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/man …
お返事ありがとうございます。
以下のようにソースを変更しました。
//////////
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と同様のヘッダーファイルに格納されているものなのではないのでしょうか?
よろしければ教えて下さい。
No.4
- 回答日時:
入力文字列の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関数内のスタティック変数はそれぞれの使用範囲において完結している=検索したい文字列を入れ子にしていないので)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- その他(コンピューター・テクノロジー) CPUクーラーをdiyしたい、けどパーツの探し方がわからない。。 2 2022/11/07 12:52
- その他(車) ぶっちゃけパートタイム4WDって必要ないですよね? 4 2023/05/07 10:12
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- 数学 (4)のim(T)をu1,u2,u3の線型結合で表せ、という問題がわからないです。回答を見ると私の解 2 2023/05/31 22:14
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- TOEFL・TOEIC・英語検定 教えてください。 (1) Keishiro always ( )calm. ①saw ② staye 3 2022/07/26 21:53
- 英語 Please allow me introduce Mr. Smith to you. 間違いはあり 1 2022/12/21 09:08
- 英語 A社 will be joining companies = 提携する?合併する?傘下になる? 5 2022/08/15 23:54
- 物理学 統計力学における平衡状態の定義について 4 2022/12/27 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
16進数を2文字ずつ配列に格納し...
-
C#でstringをポインタとして渡す
-
[C++]WCHARの1文字目しか表示で...
-
c#で他のアプリの文字入力フォ...
-
引用符と二重引用符
-
プログラムによく出てくるst...
-
WSH(VBS)でJSONの文字列を読み...
-
C++で入力した文字列から数字を...
-
[C#.net]正規表現による指定文...
-
Excelシートを固定長のテキスト...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
%dなどの違い
-
Shift_JIS(16進)を文字に変換す...
-
セグメントエラー
-
関数から配列を返すには?
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
init関数の意味
-
C言語にて構造体のメンバがNULL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報