目標
','で区切られた、一次元配列に格納されている文字列を二次元配列にコピーする。
達成していること
関数内で一次元配列から','ごとのワードを取り出す。
取り出した文字列を二次元配列にコピーすること。
エラー内容
二次元配列に単語がコピーされていない
split_word関数内22行目のprintfではコピーが確認できますが、main関数内16行目のprintfでは
data[0]=score
data[1]=NULL
data[2]=NULL
と出力されました。
質問に関する変数の説明
string[100]:文字列が格納されている一次元配列
例)ID,name,scoredata[3][100]:','で区切られた単語を取り出して格納する配列
例)
data[0]=ID
data[1]=name
data[2]=score
ソースコード
C
#include<stdio.h> #include<stdlib.h> #include<string.h> static int split_word(char *input , char *data , int start_pos ) { int in_start_pos , in_end_pos , in_pos ,out_pos ; char words[100]; input[strlen(input)-1]='\0'; /* ,で区切られた単語を取り出す /* 単語の先頭位置を探す */ for(in_start_pos=start_pos;input[in_start_pos]!='\0'&&input[in_start_pos]==',';in_start_pos++) ; /* 先頭位置が見つからなかったらを返す-1 */ if (input[in_start_pos]=='\0') return-1; /* 単語の終端位置を探す */ for(in_end_pos=in_start_pos ;input[in_end_pos+1]!='\0'&&input[in_end_pos+1]!=',';in_end_pos++); /* 単語をコピーする */ for (in_pos=in_start_pos ,out_pos=0;in_pos!=(in_end_pos+1);in_pos++ ,out_pos++) { words[out_pos]=input[in_pos]; } /* 終端記号をコピーする */ words[out_pos] = '\0' ; strcpy(data,words); printf("data->%s\n",data); return in_end_pos+1; } int main(void){ struct student student_list[100]; FILE*fp; fp=fopen("students.csv","r"); char string[100]; //エクセルのデータが入る配列 int i=0; //人数 char data[3][100]; //ID,name,scoreに分ける配列 for(i;i<2;i++){ fgets(string,100,fp) ; //1行読み込む printf("%s\n",string); int cnt5=0; int pos=0; for(cnt5;cnt5<3;cnt5++){ while((pos=split_word(string,data[cnt5],pos))!=-1); } printf("%s,%s,%s",data[0],data[1],data[2]); } return; }
まだ回答がついていません
会員登録して回答してみよう