質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

3回答

804閲覧

二次元配列へ一次元配列の要素をコピーする方法

karintage

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/05/15 16:30

編集2022/05/15 17:06

目標

','で区切られた、一次元配列に格納されている文字列を二次元配列にコピーする。

達成していること

関数内で一次元配列から','ごとのワードを取り出す。
取り出した文字列を二次元配列にコピーすること。

エラー内容

二次元配列に単語がコピーされていない

split_word関数内22行目のprintfではコピーが確認できますが、main関数内16行目のprintfでは
data[0]=score
data[1]=NULL
data[2]=NULL
と出力されました。

質問に関する変数の説明
string[100]:文字列が格納されている一次元配列
例)ID,name,score

data[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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2022/05/15 20:00

提示されたソースをコンパイルするとエラーになります。 struct student student_listがどこにも定義されていません。
guest

回答3

0

とりあえず、動くように修正しました。
struct student student_list[100];は使用していないようなので、コメントにしておきました。
改行の削除はsplit_wordの呼び出し前に1回だけ行うようにしています。

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 string[strlen(string)-1] = '\0'; //追加 改行削除 41 printf("%s\n",string); 42 int cnt5=0; 43 int pos=0; 44 for(cnt5;cnt5<3;cnt5++){ 45 pos=split_word(string,data[cnt5],pos); //修正 46 if (pos == -1) break; //修正 47 } 48 printf("%s,%s,%s",data[0],data[1],data[2]); 49 } 50 return 0; //修正 51} 52

投稿2022/05/16 01:21

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

diff

1- input[strlen(input)-1]='\0'; 2+// input[strlen(input)-1]='\0'; // ★ 削除 3 4- struct student student_list[100]; 5+// struct student student_list[100]; // ★ 削除 6 7 fgets(string,100,fp) ; //1行読み込む 8+ string[strlen(string)-1] = '\0'; // ★ 追加 9 10- while((pos=split_word(string,data[cnt5],pos))!=-1); 11+ pos = split_word(string, data[cnt5], pos); // ★ while は不要 12 } 13- printf("%s,%s,%s",data[0],data[1],data[2]); 14+ printf("%s,%s,%s\n", data[0], data[1], data[2]); // ★ \n 追加 15 16- return; 17+// return; // 削除。return 0; に変更でもよい

strtok を使えば、split_word を作る必要はありません。

C

1#include <stdio.h> // fopen, fclose, fgets, printf 2#include <string.h> // strtok, strcpy 3 4int main(void) 5{ 6 FILE *fp = fopen("students.csv", "r"); 7 if (!fp) return 1; 8 char string[100], data[3][100], *p; 9 10 while (fgets(string, 100, fp)) { 11 printf("%s", string); 12 int i = 0; 13 for (p = strtok(string, ",\n"); p && i < 3; p = strtok(NULL, ",\n")) 14 strcpy(data[i++], p); 15 printf("%s,%s,%s\n", data[0], data[1], data[2]); 16 } 17 fclose(fp); 18}

投稿2022/05/16 01:18

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語のコードを書くなら、デバッグできる環境を整えましょう。
Eclipseや、WindowsならVisualStudioなど。
コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります

投稿2022/05/15 20:39

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問