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

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

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

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

Q&A

解決済

1回答

1471閲覧

C言語 segmentation fault 11が解決

hermes

総合スコア13

C

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

0グッド

0クリップ

投稿2019/07/11 04:32

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C言語で.csvファイルをJSON化する為のプログラムを作っています.

(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

gccでコンパイルをした時点で
test.c:73:110: warning: more '%' conversions than data arguments [-Wformat]
という警告が発生し,プログラムを実行すると
hello world
Segmentation fault: 11
というメッセージが表示されます.

gcc test.c test.c:71:185: warning: more '%' conversions than data arguments [-Wformat] while (fscanf(f, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,]", ~^~~ test.c:73:110: warning: more '%' conversions than data arguments [-Wformat] printf("%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, \n", ~^ 2 warnings generated. ./a.out hello world Segmentation fault: 11

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5struct Settings{ 6 char toiletDur; 7 char durTime; 8 char otherData; 9 char date; 10}; 11 12struct Sleep{ 13 char start1; 14 char end1; 15 char durTime1; 16 char start2; 17 char end2; 18 char durTime2; 19}; 20 21struct Toilet{ 22 char start1; 23 char end1; 24 char start2; 25 char end2; 26 char start3; 27 char end3; 28 char start4; 29 char end4; 30 char start5; 31 char end5; 32 char start6; 33 char end6; 34 char start7; 35 char end7; 36 char start8; 37 char end8; 38}; 39 40struct Bath{ 41 char start1; 42 char end1; 43 char durTime1; 44}; 45 46struct Option{ 47 char remarks; 48 char name; 49}; 50 51int main(void){ 52 53 struct Settings set; 54 struct Sleep slp; 55 struct Toilet toi; 56 struct Bath bat; 57 struct Option opt; 58 59 60 FILE *f; 61 char file_name[] = "test3.csv"; 62 63 printf("hello world\n"); 64 65 /* ファイルオープン */ 66 if ((f = fopen(file_name, "r")) == NULL) { 67 fprintf(stderr, "%s\n", "error: can't read file."); 68 return EXIT_FAILURE; 69 } 70 71 while (fscanf(f, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,], %[^,]", 72 &set.date, &slp.start1, &slp.end1, &slp.durTime1, &slp.start2, &slp.end2, &slp.durTime2, &toi.start1, &toi.end1, &toi.start2, &toi.end2, &toi.start3, &toi.end3, &toi.start4, &toi.end4, &toi.start5, &toi.end5, &toi.start6, &toi.end6, &toi.start7, &toi.end7, &toi.start8, &toi.end8) != EOF){ 73 printf("%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, \n", 74 &set.date, &slp.start1, &slp.end1, &slp.durTime1, &slp.start2, &slp.end2, &slp.durTime2, &toi.start1, &toi.end1, &toi.start2, &toi.end2 , &toi.start3, &toi.end3, &toi.start4, &toi.end4, &toi.start5, &toi.end5, &toi.start6, &toi.end6, &toi.start7, &toi.end7, &toi.start8, &toi.end8); 75 } 76 77 fclose(f); 78 79 return 0; 80 81}

試したこと

セグメンテーションフォルトに至る様な箇所を探したが見当たらなかった.
他の.csvファイルを試してみたが,そちらも上手くデータが出力されなかった.

補足情報

当方プログラミング初心者です.何か重要な所を見落としている可能性があります.ご教示頂ければと思います.

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

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

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

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

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

guest

回答1

0

ベストアンサー

google翻訳
警告:データ引数より '%'変換が多い[-Wformat]

そこらへんチェックしてみては。

初心者ならなおのこと、エラーメッセージはきちんと読むようにしよう

投稿2019/07/11 04:34

編集2019/07/11 04:36
y_waiwai

総合スコア87774

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

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

hermes

2019/07/11 04:43

ありがとうございます.やはり%の方が多かった様です.しかしcsvの読み込みが止まらないバグが新たに発生したので,また質問を投稿させて頂きます.本当にありがとうございます.
y_waiwai

2019/07/11 05:01

scanf系の関数は、ちょっと間違えると即暴走する危険な関数なので、できれば使わないほうがいいですね やるなら、fgetsなどで1行分のテキストを読み込み、そこから分解するようにしたほうがいいでしょう
hermes

2019/07/11 05:02

ありがとうございます.使用してみます!
hermes

2019/07/11 05:05

fgetsを使用する場合はどのように分解すれば良いでしょうか?
hermes

2019/07/11 05:16

ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問