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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C言語の2次元配列 容量が大き...
-
プログラム 数列の和
-
配列の要素数に変数を入れたい...
-
5人分の氏名と英語、国語、数...
-
MFCのCArrayを使った二次元配列
-
Winsockを用いてデータを交互に...
-
C#で配列が空かを判定するには?
-
fclose()でセグメンテーション違反
-
C#で構造体の配列を持った構造...
-
C言語から質問です。
-
MFC - ダイアログボックスのPic...
-
コンボボックスでデフォルト値...
-
無作為に選択
-
「互換でない型変換」というエ...
-
define で 配列
-
c言語 構造体
-
C#でのフィボナッチ数列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語 ファイルの指定された行...
-
C言語についてです 5人のテスト...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報