
ex.filのファイルの中身は以下の通りです。
0103 美空ひばり 川の流れのように
0209 山口百恵 いい日旅立ち
0992 キャンディーズ 危ない土曜日
このデータを構造体「iti」に読み込ませるために
以下のようにしました。
------------------------
typedef struct itiran_ {
char code[5];
char singer[20];
char melody[50];
} itiran;
itiran iti;
int main(void){
char buf[5];
char buf2[100];
・
・
・
fp = fopen("ex.fil","r");
if(fp == NULL){
exit(1);
}
i = 0;
while(fgets(buf2,sizeof buf2,fp) != NULL)
iti[i].code = strtok(buf2," ");
↑ここでエラー
iti[i].singer = strtok(NULL," ");
iti[i].melody = strtok(NULL,"\n");i++;
}
------------------------
「iti[i].code = strtok(buf2," ");」のところで
「互換でない型変換」というエラーが出てしまいます。
iti[i].codeも
buf2も
どちらもchar型変数なのに
どうしてこのようなエラーになるのかが
分かりません。
ご教示して頂けたら幸いです。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
問題は大きく分けて二つ。
・itiは配列じゃない。
最大数を適当に見込んで配列として宣言するか、
動的確保するなどの対策が必要です。
仮に、最大100件だけ処理するとしましょうか。
itiran iti[100];
・行の分解にstrtok()は効率が悪い。
行の分解部分は、次のようなコードで事が足ります。
if (sscanf(buf2, "%4s %19s %49s", iti[i].code, iti[i].singer, iti[i].melody) != 3) {
// 項目が足りない。必要ならここでエラー処理
}
・念のために、最大数を超えないチェックもしておきましょう。
++i;
if (i == sizeof(iti) / sizeof(*iti)) {
// 100件到達。適当にエラー処理
break;
}
No.2
- 回答日時:
エラーとは直接関係無いかもしれませんが。
strtokの戻り値はポインタです。
itiran.codeは配列として宣言されているので本質的には違う型です。
itiran.code を char* で宣言するか、
char* tmp = strtok(buf2," ");
strncpy(iti[i].code, tmp, strlen(tmp));
iti[i].code[strlen(tmp)] = '\0';
などとした方が良いと思います。
この回答への補足
鋭いご指摘有り難うございました。
>itiran.code を char* で宣言するか、
ということでしたので
typedef struct itiran_ {
char* code;
char* singer;
char* melody;
} itiran;
と、してみました。
上手く行きそうだったのですが
強制終了になってしまいました。
問題はprintfのポインタの参照方法だと思うのですが
どのように参照すればいいのか
ご教示して頂けたら幸いです。
------------------------
・
・
・
iti[i].code = strtok(buf2," ");
iti[i].singer = strtok(NULL," ");
iti[i].melody = strtok(NULL,"\n");
printf("can %s %s",*iti[i].code , *iti[i].singer);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語プログラミング 等差数列...
-
関数から配列を返すには?
-
C言語から質問です。
-
const で宣言してるのに、値が...
-
構造体のextern方法
-
C言語 ファイルの指定された行...
-
C言語の2次元配列 容量が大き...
-
C言語 数値の連続入力について
-
配列の要素数に変数を入れたい...
-
C言語を使って、ファイルの読み...
-
5人分の氏名と英語、国語、数...
-
C言語で重複組合せを全列挙
-
MFC - ダイアログボックスのPic...
-
fclose()でセグメンテーション違反
-
C++DLLからC#へのコールバック...
-
int i, int i[1];
-
define で 配列
-
c言語
-
c言語 構造体
-
VBAのプログラムで、DIAG = 1# ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
c言語
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C#で配列が空かを判定するには?
-
コンボボックスでデフォルト値...
-
C言語 ファイルの指定された行...
-
C言語の2次元配列 容量が大き...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
配列のアドレス部
-
構造体を引数とする関数について
-
fclose()でセグメンテーション違反
-
C言語 数値の連続入力について
おすすめ情報