目標
','で区切られた、一次元配列に格納されている文字列を二次元配列にコピーする。
達成していること
関数内で一次元配列から','ごとのワードを取り出す。
取り出した文字列を二次元配列にコピーすること。
エラー内容
二次元配列に単語がコピーされていない
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
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5 static int 6 split_word(char *input , char *data , int start_pos ) { 7 int in_start_pos , in_end_pos , in_pos ,out_pos ; 8 char words[100]; 9 input[strlen(input)-1]='\0'; 10/* ,で区切られた単語を取り出す 11 /* 単語の先頭位置を探す */ 12 for(in_start_pos=start_pos;input[in_start_pos]!='\0'&&input[in_start_pos]==',';in_start_pos++) ; 13 /* 先頭位置が見つからなかったらを返す-1 */ 14if (input[in_start_pos]=='\0') return-1; 15 /* 単語の終端位置を探す */ 16for(in_end_pos=in_start_pos ;input[in_end_pos+1]!='\0'&&input[in_end_pos+1]!=',';in_end_pos++); 17 18 /* 単語をコピーする */ 19 for (in_pos=in_start_pos ,out_pos=0;in_pos!=(in_end_pos+1);in_pos++ ,out_pos++) { 20 words[out_pos]=input[in_pos]; 21 } 22 /* 終端記号をコピーする */ 23 words[out_pos] = '\0' ; 24 25 strcpy(data,words); 26 printf("data->%s\n",data); 27 return in_end_pos+1; 28} 29 30int main(void){ 31 struct student student_list[100]; 32 FILE*fp; 33 fp=fopen("students.csv","r"); 34 char string[100]; //エクセルのデータが入る配列 35 int i=0; //人数 36 char data[3][100]; //ID,name,scoreに分ける配列 37 38 for(i;i<2;i++){ 39 fgets(string,100,fp) ; //1行読み込む 40 printf("%s\n",string); 41 int cnt5=0; 42 int pos=0; 43 for(cnt5;cnt5<3;cnt5++){ 44 while((pos=split_word(string,data[cnt5],pos))!=-1); 45 } 46 printf("%s,%s,%s",data[0],data[1],data[2]); 47 } 48 return; 49}