- 締切済み
「互換でない型変換」というエラーが出てしまいます。
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型変数なのに どうしてこのようなエラーになるのかが 分かりません。 ご教示して頂けたら幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- charmer29-2
- ベストアンサー率25% (41/159)
問題は大きく分けて二つ。 ・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; }
- frogeye
- ベストアンサー率47% (11/23)
エラーとは直接関係無いかもしれませんが。 strtokの戻り値はポインタです。 itiran.codeは配列として宣言されているので本質的には違う型です。 itiran.code を char* で宣言するか、 char* tmp = strtok(buf2," "); strncpy(iti[i].code, tmp, strlen(tmp)); iti[i].code[strlen(tmp)] = '\0'; などとした方が良いと思います。
- silverbear
- ベストアンサー率25% (163/639)
たぶんですが。 iti[i].code = strtok(buf2," "); これitiは配列の宣言してませんよね? とりあえず iti.code = strtok(buf2," "); だとエラーが出なくなると思います。
お礼
ご返事有り難うございました。 お陰様で エラーが無くなりました。 単純なミスだったんです。
補足
鋭いご指摘有り難うございました。 >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);