• 締切済み

「互換でない型変換」というエラーが出てしまいます。

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型変数なのに どうしてこのようなエラーになるのかが 分かりません。 ご教示して頂けたら幸いです。

  • niiza
  • お礼率43% (211/486)

みんなの回答

回答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; }

  • frogeye
  • ベストアンサー率47% (11/23)
回答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'; などとした方が良いと思います。

niiza
質問者

補足

鋭いご指摘有り難うございました。 >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);

回答No.1

たぶんですが。 iti[i].code = strtok(buf2," "); これitiは配列の宣言してませんよね? とりあえず iti.code = strtok(buf2," "); だとエラーが出なくなると思います。

niiza
質問者

お礼

ご返事有り難うございました。 お陰様で エラーが無くなりました。 単純なミスだったんです。

関連するQ&A

  • コンパイルエラーの原因がわからず困っています。

    こんばんは。 どなたか以下のプログラム(test4.c)が何故コンパイル出来ないのか教えて頂けませんか。行数は見やすいように一時的につけさせて頂きました。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> 5 #include<errno.h> 6 #include<signal.h> 7 #include<sys/types.h> 8 9 10 11 12 13 int main(){ 14 FILE *fp,*fp2; 15 char str[1024]; 16 char *tok; 17 char buf[256]; 18 fp = fopen("file.txt","r"); 19 int i = 0; 20 fp2 = fopen("out.txt","a"); 21 22 while((str = fgets(str,1024,fp)) == EOF){ 23 24 while(1){ 25 // 前文を取得 26 tok = strtok(str, "("); 27 printf("%s\n",tok); 28 strcat(buf, tok); 29 30 // 中文を取得 31 tok = strtok(NULL, ")"); 32 if(tok == NULL)break; 33 tok = strtok(NULL, ")"); 34 if(tok == NULL)break; 35 36 *(tok + 1) = '\0'; 37 tok = strtok(NULL, "CEUFRSAP.");//フラグをトークンの材料にする 38 strcat(buf,tok); 39 40 // 後文を取得 41 tok = strtok(NULL, "("); 42 tok = strtok(NULL, ")"); 43 strcat(buf,"tcp "); 44 strcat(buf,tok); 45 break; 46 } 47 printf("%s\n",buf); 48 printf("%d行目です/n",i++); 49 fputs(buf,fp2); 50 } 51 52 printf("合計%d行です\n",i); 53 fclose(fp); 54 fclose(fp2); 55 return 0; 56 } 以下がコンパイルエラーの全文です。 test4.c: In function ‘main’: test4.c:22: error: incompatible types in assignment どんな些細な意見でも結構です。アドバイスをして頂けないでしょうか。どうぞよろしくお願いします。

  • strtok

    strtokにて分解した文字を各変数に格納する場合 char *p; FILE *fp; char buf[1000]; if((fp = fopen("○","r"))==NULL){ return 0; } if(!fgets(buf,1000,fp)) return 0; strcpy(p, buf); number = strtok(p,","); class_type = strtok(NULL,","); name = strtok(NULL,","); subject = strtok(NULL,","); と一行の文字列を各変数に格納しています。 ファイルの一行は以下のような形式になっています。 1,A,山田,数学//番号,クラスタイプ,名前,得意教科 これで各値は変数に格納できています。 しかし このファイルはCSVファイルなのですが、空の欄があると 1,A,,数学というデータがbuf内に入っています。 この場合 number→1 class_type→A name→数学 と空欄の箇所が飛ばされてしまっています。 改善する方法がわからないのですが strtokを使わない方がいいのでしょうか?

  • エラーがないのに正常に動かない

    以前質問したのものです。 アドバイス等いただき、プログラムを修正しエラーをなくしました。 しかし、プログラムが動きません。。。 プログラムの動作は CSVファイルを読み込んで、処理をする。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムの内容は #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[5][1000][2][256]; char tp[256]; char *ttp; int i=0,ii=0; if((fp=fopen("out1.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); return -1; } while(fgets(tp,256,fp)!=NULL){ ttp=strtok(tp,","); strcpy(&s[0][ii][i][0],ttp); puts(&s[0][ii][i][0]); while (ttp != NULL ) { i++; ttp=strtok(NULL,","); if (ttp != NULL ){ strcpy(&s[0][ii][i][0],ttp); puts(&s[0][ii][i][0]); }}i=0; ii++;if(ii>=1000)break; } return(0); } です。 わけがわからなくなりました(泣 どこが原因なのかも書いていただけるとありがたいです。

  • ポインタについて

    途中までのソースコード typedef struct node{ char moji[128]; --------(1) }NODE; int main(int argc, char *argv[]){ FILE *fp; char buf[128]; NODE p[128]; char *tp; int i = 0; int j,k; int res; NODE temp; fp = fopen(argv[1],"r"); while(fscanf(fp,"%s",&buf) == 1){ tp = strtok(buf," ,.-"); strcpy(p[i].moji,tp); ---------(2) i++; while(tp != NULL){ tp = strtok(NULL," ,.-"); if(tp != NULL){ strcpy(p[i].moji, tp); --------(2) i++; } } } for(j = 0;j < i; j++) puts(p[j].moji); return 0; } file.txt これ以下の文字を読み込む -------------- The Java programming language is a general-purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve fluency in the language. 例えばこんなソースコードがあって、(1)をポインタにして、(2)のstrcpyを使わずにポインタだけで表現するとしたらどのようになるんですか?

  • fopenについて

    ご質問させて頂きます。 ファイルの中身は以下の通りです。 TX55123455846521113456211415122335122200452125442[EOF] という感じの 一行だけの細長いデータです。 このファイルのデータを 読み取ろうとして 以下の様にしました。 int main(void){ char buf[5]; FILE *fp; fp = fopen("ex.fil","r"); if (fp == NULL){ printf("can't open"); exit(1); } エラーは出ないのですが データがないと判断されてしまうようで 「can't open」 となってしまいます。 どういう点がおかしいのか お気づきな点がありましたら ご教示して頂けたら幸いです。

  • C言語 配列挿入

    失礼します。カンマ区切りのC言語を配列に挿入したいのですが、エラーが出てしまいます。 初心者的な質問で申し訳ございませんが、よろしくお願いします。 途中までですが、コードを掲載させていただきます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define piyo 11 #define hoge 2900 int main(void) { FILE *fp; char test[piyo][hoge]; char buf[hoge]; char *ary[hoge]; int i, k; test[piyo][hoge] = NULL; if ((fp = fopen("testfile.csv", "r")) == NULL) { printf("\aファイルをオープンできません\n"); }else{ while (fgets(buf, hoge, fp) != NULL) { for (k = 0; k < hoge; k++) { ary[k] = strtok(buf, ","); } } fclose(fp); return(0); } エラーメッセージ 警告 C4047 '=': 間接参照のレベルが 'char' と 'void *' で異なっています。 C1075 左側の 中かっこ '{' に対応するものがファイルの最後まで検出されませんでした。

  • C言語→C#に変換

    C言語→C#に変換 C言語からC#に変換したいのですが、わからないところがあります。 コマンドライン引数からファイル名とキーワードを入力して、キーワードがある行をアウトプットファイルに書き込むという処理です。 C言語のソースは、 main(int argc,char *argv[]){ FILE *fp; FILE *fpp; int i; char KEYWORD[256]; char buf[256]; //(1)アウトプットファイルのオープン fpp=fopen("output.txt","w"); for(i=1;i<argc-1;i++){ if(strcmp(argv[i],"-a")==0){ //(2)入力ファイルのオープン if((fp=fopen(argv[i],"r"))==NULL){ printf("open error!\n"); exit(1); } } //(3)キーワードの代入 if(strcmp(argv[i],"-b")==0){ strcpy(KEYWORD,argv[i]); } } //(4)一行読み込む while(fgets(buf,sizeof(buf),fp)!=NULL){ //(5)キーワードの条件で文字列抽出 if(strstr(buf,KEYWORD)!=NULL){ //(6)アウトプットファイルに出力 fprintf(fpp,"%s",buf); } } //ファイルクローズ fclose(fp); fclose(fpp); } です。 (3)キーワードの代入と、(5)文字列抽出の部分がネットなどで調べてもよくわかりません。 分かる方いらっしゃいましたら教えていただけると幸いです。 宜しくお願いします。 .

  • 16進数から10進数に変換

    いつもお世話になります。 先日バイナリデータを読み込み、ある特定のデータを検索し、 そのデータを10進数に変換する処理がしたいです。 FILE *fp; char buf[1024]; fp = fopen("sample.jpg","rb"); fread(buf, siZeof(char), 1024, fp); for( int i=0; i<1024; i++ ){ if( (buf[i]==0xff) && (buf[i+1] == 0xe0) ){ //※質問詳細下記します。 } } ※ f文で、buf[i+2]buf[i+3]、例えばprintf("%02x,%02x",buf[i+2],buf[i+3]); で出力すると、所望の(11 00 )の16進数で得られています。 このbuf[i+2] buf[i+3]の値を10進数に変換して得るには、 どうしたらいいでしょうか? 0x1100→4352 どうぞよろしくお願い致します。

  • C言語 strtok

    失礼します。現在こちらでアドバイスを頂きfgetcを使用して配列に格納をすることができたのですが、CSVをカンマ区切りで格納したいのですが上手くいかず困っています。strtokを使用方法をドキュメントを読んでもうまく区切ったものを配列に入れる方法がわかりません 何卒よろしくお願いします。 ソースコード #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define MAXITEM 1400 int split(char *str, const char *delim, char *outlist[]) { char *tk; int cnt = 0; tk = strtok(str, delim); while (tk != NULL && cnt < MAXITEM) { outlist[cnt++] = tk; tk = strtok(NULL, delim); } return cnt; } int main(void) { FILE *fp; char *fname = "testfile.csv"; char *tp; char *array[1400]; char *test[11][1400]; char c; int i = 0; int n,y; char *tp[1400]; fp = fopen(fname, "r"); if (fp == NULL) { printf("%sファイルが開けません¥n", fname); return -1; } while ((c = fgetc(fp)) != EOF) { array[i] = (char)c; i++; } tp = strtok(array, ","); puts(*tp); while (tp != NULL) { tp = strtok(NULL, ","); if (tp != NULL)puts(tp); } for (n = 0; n < 11; n++) { for (y = 0; y < 1400; y++) { test[n][y] = tp[y]; printf("%c", test[n][y]); } } fclose(fp); return 0; }

  • ファイルの入出力に関する質問

    CSVファイルを読み込んで、処理をするプログラムを書いています。 しかし、うまくいきません。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムは以下の通りなんですが。。。 strtokはhttp://www9.plala.or.jp/sgwr-t/lib/strtok.html を参考にしました。 どなたかおしえていただけないでしょうか? #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[1000][1000]; char tp[256]; int i=0; if((fp=fopen("in.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); exit(1); } while(fgets(tp,256,fp)!=NULL){ tp=strtok(fp,","); puts(s[i][0]=tp); while (tp != NULL ) { tp = strtok(NULL,","); if (tp= NULL ){ puts(s[i][1]=tp); }}i++; } return(0); }

専門家に質問してみよう