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

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

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

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

Q&A

解決済

2回答

1148閲覧

C言語 Segmentationfault11の解決策が不明

hermes

総合スコア13

C

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

0グッド

0クリップ

投稿2019/07/11 13:10

編集2019/07/11 13:23

前提・実現したいこと

.csvファイルをJSON化するプログラムです.現段階ではcsvファイルを読み込み,配列に格納する所まで制作しました.

発生している問題・エラーメッセージ

2行目のcsvデータを表示し終えた後にSegmentationFault11が発生.3行目の読み込みが出来ない.
もう一つ気がかりなのが,csvファイルの最後の列である[name]の"]"だけが表示されない事.

./a.out [Settings] [Toilet_Duration] [0:01] [date] [sleep_state.start1] [sleep_state.end1] [sleep_state.dur1] [sleep_state.start2] [sleep_state.end2] [sleep_state.dur2] [toilet.start1] [toilet.end1] [toilet.start2] [toilet.end2] [toilet.start3] [toilet.end3] [toilet.start4] [toilet.end4] [toilet.start5] [toilet.end5] [toilet.start6] [toilet.end6] [toilet.start7] [toilet.end7] [toilet.start8] [toilet.end8] [bath.start] [bath.end] [bath.dur] [remarks] [name Segmentation fault: 11

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define N 512 // 1行の最大文字数(バイト数) 6#define X 512 7#define Colum 30 8 9int main(void) { 10 FILE *fp; // FILE型構造体 11 char fname[] = "test2.csv"; 12 char str[N]; 13 char *box[X]; 14 char *p; 15 int i = 0; 16 //bool bol = true; 17 18 //ファイルの読み込み判断 19 fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 20 if(fp == NULL) { 21 printf("%s file not open!\n", fname); 22 return -1; 23 } 24 25 /***************** 26 * 1行目 27 */ 28 29 //ファイルを1行ごとに呼び出し 30 fgets(str, N, fp); 31 //", " で分解 32 p = strtok(str, ","); 33 34 //puts(p); 35 //box[]に値を収納 36 box[i] = p; 37 i++; 38 39 while(p!=NULL){ 40 p = strtok(NULL,","); 41 42 if(p!=NULL){ 43 44 //puts(p); 45 box[i] = p; 46 //printf("%s\n", box[i]); 47 i++; 48 } 49 } 50 51 //printf("%s\n", str); 52 53 //printしてるのここ 54 printf("[%s] [%s] [%s]\n", box[0], box[1], box[2]); 55 56 /******************* 57 * 2行目 58 */ 59 60 //ファイルを1行ごとに呼び出し 61 while (fgets(str, N, fp)!=NULL) { 62 i = 0; 63 //", " で分解 64 p = strtok(str, ","); 65 66 //puts(p); 67 //box[]に値を収納 68 box[i] = p; 69 i++; 70 71 while (p != NULL) { 72 p = strtok(NULL, ","); 73 74 if (p != NULL) { 75 76 //puts(p); 77 box[i] = p; 78 //printf("%s\n", box[i]); 79 i++; 80 } 81 } 82 83 //printしてるのここ 84 for (int j = 0; j < Colum; j++) { 85 printf("[%s] ", box[j]); 86 } 87 printf("\n"); 88 } 89 90 91 /****************************************** 92 * 最後の〆 93 */ 94 fclose(fp); // ファイルを閉じる 95 96 printf("\n"); 97 98 return 0; 99}

試したこと

Segmentation Faultに陥る状況の例などを参照.
自身のファイルにそれぞれの条件が当てはまらないか比較.
While文を除去し2行目だけ実行.結果は変わらず.

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

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

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

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

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

guest

回答2

0

while (fgets(str, N, fp)!=NULL) {
との絡みで、データファイルの「2行目」が512バイトを超えているとそういうこともあるかと思うけど。

あと、現時点では関係なさそうだけど、
for (int j = 0; j < Colum; j++) {
って大丈夫かしら?
for (int j = 0; j < i; j++) {
の方が安全では。
(さらに、box[]の範囲外アクセスがないようにガードもすべきだとも思う。

投稿2019/07/11 13:57

thkana

総合スコア7639

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

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

hermes

2019/07/11 14:00

ありがとうございます!本当に助かります.
guest

0

ベストアンサー

"test2.csv" の中身は、どうなってますか?
特に 2行目。 512 byteを越えてませんか?

#define N 512 を 1024 とかにしても変わりませんか?

投稿2019/07/11 13:47

pepperleaf

総合スコア6383

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

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

hermes

2019/07/11 13:53

おっしゃる通りでした.NとXを2048にしたところ問題なくプログラムが動きました.本当にありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問