• ベストアンサー

漢字を配列に入れたいのですが

漢字を配列に入れたいのですが、うまくいきません。 3列、60行のcsvファイルを読み込んで配列に入れようをしているのですが、1列目、2列目、3列目にある漢字をそれぞれ配列に入れようとしているのですが、出力するとうまくいかないんです。誰か教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; unsigned int data1[60], data2[60], data3[60]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; ll= fgets(buff,MAXBUFFSIZE,fp); while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; j++; } printf("%s\n%s\n%s\n", data1,data2,data3); }

質問者が選んだベストアンサー

  • ベストアンサー
  • tana_y
  • ベストアンサー率41% (7/17)
回答No.5

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 #define MAXLINE 256 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; char data1[60][MAXLINE], data2[60][MAXLINE], data3[60][MAXLINE]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); //printf("%s\n%s\n%s\n", words[0], words[1], words[2]); memcpy(data1[j], words[0], MAXLINE); memcpy(data2[j], words[1], MAXLINE); memcpy(data3[j], words[2], MAXLINE); j++; } for(i=0; i<60; i++){ printf("%s\n%s\n%s\n", data1[i],data2[i],data3[i]); } } 1セルの漢字は最大文字数*3+1したものをMAXLINEに使ってください。 1行のバイト数が255超えてもおかしくなると思います。

その他の回答 (4)

  • tana_y
  • ベストアンサー率41% (7/17)
回答No.4

epistemeさんの言われるとおり data1[j] = words[0]; data2[j] = words[1]; data3[j] = words[2]; wordsはfgets(buff,MAXBUFFSIZE,fp)のbuffを指すポインタなので もう一度fgetsが行われると中身が書き換えられ、 最後にfgetsした中身が60回表示されていました。 修正が足りなかったですね。失礼致しました。(涙) とりあえず個別変更を書くと間違いも起こるので全て書いておきますね。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFSIZE 256 #define MAXWORDS 15 int split(char* words[], int length, char* split_ch,char* str){ int i,j; for(i=0;i<length;i++){ if((words[i] = strtok(str,split_ch))==NULL)break; str=NULL; } return(i); } int main(int argc, char* argv[]){ if(argc !=2){ printf("入力エラー"); return(0); } FILE *fp; char *ll, *words[MAXWORDS], ch, buff[MAXBUFFSIZE]; int i,j; char data1[60][MAXWORDS], data2[60][MAXWORDS], data3[60][MAXWORDS]; if((fp =fopen(argv[1],"r"))==NULL){ printf("ファイルが開けません。\n"); } j=0; while((ll= fgets(buff,MAXBUFFSIZE,fp)) != NULL){ split(words, MAXWORDS, ",",ll); //printf("%s\n%s\n%s\n", words[0], words[1], words[2]); memcpy(data1[j], words[0], MAXWORDS); memcpy(data2[j], words[1], MAXWORDS); memcpy(data3[j], words[2], MAXWORDS); j++; } for(i=0; i<60; i++){ printf("%s\n%s\n%s\n", data1[i],data2[i],data3[i]); } }

fzgu1984
質問者

補足

すいません。今度は、配列にまず入った後、その列の次の行が先頭になって入っていき徐々に、直角三角形を下にしたようになくなっていくようになったんです。これは、どういう挙動なんですか?

回答No.3

> ファイルの1番最終行の3文字が60回繰り返して出力するようになってしまいました。 当然でしょう。ポインタのコピーは実体のコピーではありませんから。 buffは一個しかありませんからね。同じとこ指してますね。

  • tana_y
  • ベストアンサー率41% (7/17)
回答No.2

unsigned int data1[60], data2[60], data3[60]; ここは char *data1[60], *data2[60], *data3[60]; printf("%s\n%s\n%s\n", data1,data2,data3); は for(i=0; i<60; i++){ printf("%s\n%s\n%s\n", data1[i],data2[i],data3[i]); } セグメンテーション違反になるのは、読み込んだデータが60行じゃ ない可能性があるかも? とこんな感じでいかがでしょう。

fzgu1984
質問者

補足

上のように直したんですが、ファイルの1番最終行の3文字が60回繰り返して出力するようになってしまいました。 入ったと思ったのに、どうしてこんなことになるのかさっぱりなのですが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「うまくいかない」というだけで状況を理解するのは多くの人にとって非常に困難なので, 最低限 ・どのような入力に対し ・どのような結果を期待したところ ・実際に得られた結果はどうなったのか くらいは書いてください. あと, 処理系 (OS やコンパイラ) であるとか入力ファイルで使っている文字コードなんかもあると助かる.

fzgu1984
質問者

補足

文字コードはutf-8desu。 出力結果は、ファイルの中身は出てきたけれども配列はセグメンテーション違反です、としか出ませんでした。

関連するQ&A