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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

2763閲覧

strtokとポインタの扱い方がわかりません.

hermes

総合スコア13

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

1クリップ

投稿2019/07/11 06:49

編集2019/07/11 08:50

前提・実現したいこと

.csvファイルをJSON化するプログラムを制作しています.csvファイルの読み取りまでは上手くいったのですが,strtokとポインタの使い方がいまいち掴めず,データがboxに格納されているのか判断できません.
.csvファイルを1行ごと読み込み,strtokを使用して分解,その分解したデータを格納するタイミングで問題が起きているようです.

当該のソースコード

#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 512 // 1行の最大文字数(バイト数) #define X 30 int main(void) { FILE *fp; // FILE型構造体 char fname[] = "test2.csv"; char str[N]; char *box[X]; char *p; fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 if(fp == NULL) { printf("%s file not open!\n", fname); return -1; } fgets(str, N, fp); p = strtok(str, ","); puts(p); box[0] = p; while(p!=NULL){ p = strtok(NULL,","); if(p!=NULL){ int i = 1; puts(p); box[i] = p; //printf("%s\n", box[i]); i++; } } printf("%s\n", str); fclose(fp); // ファイルを閉じる for(int j=0; j<=X-1; j++){ printf("%c", *box[j]); } printf("\n");*/ return 0; }

出力されるコード

./a.out Settings Toilet_Duration Toilet_Duration 0:01 0:01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Settings Segmentation fault: 11

編集後の該当のソースコード

#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 512 // 1行の最大文字数(バイト数) #define X 512 int main(void) { FILE *fp; // FILE型構造体 char fname[] = "test2.csv"; char str[N]; char *box[X]; char *p; int i = 0; fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 if(fp == NULL) { printf("%s file not open!\n", fname); return -1; } fgets(str, N, fp); p = strtok(str, ","); puts(p); box[i] = p; i++; while(p!=NULL){ p = strtok(NULL,","); if(p!=NULL){ puts(p); box[i] = p; printf("%s\n", box[i]); i++; } } printf("%s\n", str); fclose(fp); // ファイルを閉じる printf("%c\n", *box[1]); printf("\n"); return 0; }

編集後の出力されるコード

hermes$ gcc line.c hermes$ ./a.out Settings Toilet_Duration Toilet_Duration 0:01 0:01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Settings T

元の.csvデータ

Settings,Toilet_Duration,0:01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

試したこと

どの地点でSegmentation faultが起きているのか知る為にprintf関数を使用して文字列を出力させた.

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

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

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

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

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

guest

回答3

0

i がずっと 1 です。

for(int j=0; j<=X-1; j++){

X - 1 まで入っていないのでそこまで列挙してはいけません。

投稿2019/07/11 07:07

Zuishin

総合スコア28660

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

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

hermes

2019/07/11 07:16

コードを訂正しました.まだ問題があるので質問の方を編集します.
Zuishin

2019/07/11 07:20

一問一答です。別の問題なら仕切り直してください。完成までは面倒みられません。
Zuishin

2019/07/11 07:22

それと、問題はなるべく自分で解決してください。
hermes

2019/07/11 08:07

失礼致しました.以後注意します.
Zuishin

2019/07/11 08:08

不当な低評価を戻しなさい。
hermes

2019/07/11 08:13

まだ低評価の機能が解放されていなくて,僕は押してないのですが.勘違いであったら申し訳ありません.
Zuishin

2019/07/11 16:57 編集

低評価したならどこが間違っているのか書いてみなさい。ちょっと考えたらあなたの方が間違っていることがわかるでしょう。
Zuishin

2019/07/11 14:38 編集

削除
haruniku

2019/07/11 11:29

また強要してますね笑
Zuishin

2019/07/12 03:05

低評価の理由を書きなさい。
ai_2013_dev

2019/07/12 11:14

私も、この回答がマイナス評価される理由を知りたい
guest

0

ベストアンサー

コードを良く見てください。明らかにおかしい場所が一点あります。

c

1 if(p!=NULL){ 2 int i = 1; 3 puts(p); 4 box[i] = p; 5 i++; 6 }

i = 1 としているので、この中では常に box[1] = p となりますね。

そして、最後の printf で参照しているのは j=0, 1, 2,.... となるので、 j = 2 の時点で初期化されていない box[2] を参照しようとしてエラーとなります。

printfデバッグについて

c

1printf("%s\n", str);

のように改行文字を追加しましょう。でないと高確率でコンソールに出力される前にプログラムが終了してしまいまうので、「その箇所を通ってない」と勘違いしやすいです。

投稿2019/07/11 07:12

mather

総合スコア6753

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

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

hermes

2019/07/11 07:17

ありがとうございます.訂正したものを元の質問の方に再掲載します.まだ問題があるようです.
mather

2019/07/11 07:22

質問を編集するときはプレビューも確認しながら更新しましょう。
mather

2019/07/11 07:24

更新後のコードでは何が問題なのでしょうか? 質問に記載してください。
mather

2019/07/11 07:26

ついでに、質問を更新するときは上書きではなく更に下に追加するほうが良いですよ。 最初の状態で回答した内容が更新された質問に対して的はずれなものになってしまいます。
Zuishin

2019/07/11 07:27

次の質問なので、解決済みにして新しく質問すべきと思います。
mather

2019/07/11 07:28

それもそうですね。
Zuishin

2019/07/11 07:30

コードも全く変わっているし、この調子で人の話を聞かない人に完成まで追加質問されても付き合いきれません。mather さんの回答をベストアンサーに選び、新しく質問してください。
hermes

2019/07/11 07:30

申し訳ありません.次回以降気をつけます.
Zuishin

2019/07/11 07:31

今回からです。
Zuishin

2019/07/11 08:00 編集

低評価しやがった。
Zuishin

2019/07/11 14:37 編集

削除
hermes

2019/07/11 07:52

先ほど削除してしまった質問を再掲載しました. 新しく書いたコードでは最後の printf("%c\n", *box[1]); の部分で表示されるのが "T" 1文字となってしまいます.私としては "Toilet_Duration" と出力して欲しいです. 何かアドバイスなどありますでしょうか?どうぞよろしくお願い致します.
Zuishin

2019/07/11 08:00 編集

個人情報が含まれていたので削除
mather

2019/07/11 07:55

Zuishinさんの言う通り、できれば別の質問にしたほうが良いですね。 %sと違って、%c ってchar型の値を表示するんです。
Zuishin

2019/07/11 07:57

こんなのに餌をやらなくていい。
hermes

2019/07/11 08:03

ご指摘ありがとうございます.
mather

2019/07/11 08:08

Zuishinさん、そんなに感情的にならなくてもいいと思いますよ。嫌になったら見ないようにしたほうが良いです。 hermesさんも回答をいただけたことにまずは感謝して、聞きたいことが変わったなら別の質問を立てて聞くべき(Zuishinさんのおっしゃる通り)ですし、何でもかんでも教えてもらえると思わずに、まずはリファレンスをしっかり確認して自分で考える癖を付けましょう。
Zuishin

2019/07/11 14:35 編集

嫌なら見ない方がいいですよ。
hermes

2019/07/11 08:11

承知致しました.私も”聞けばわかる”と安易に考えてしまっていました.反省しております.今後は自分から動いて(リファレンスなどを探って)成長していけたらと思います.ご指摘本当に感謝致します.ありがとうございます.
hermes

2019/07/11 08:12

Zuishinさん 本当に申し訳ありませんでした.聞く前にまず調べる事を今後は徹底していきたいと考えております.どうぞよろしくお願い致します.
Zuishin

2019/07/11 08:13

不当な低評価を戻しなさい。
hermes

2019/07/11 08:15

今日teratailを始めたばかりで低評価の機能がまだ解放されておりません.私は押していないと思うのですが,,,勘違いでしたら申し訳ございません.
Zuishin

2019/07/11 14:36 編集

削除
Zuishin

2019/07/11 14:37 編集

削除
mather

2019/07/11 11:49

お二人とも、ここは「回答へのコメント」をする場だと思いますので、一旦この場での会話は止めていただけませんか。よろしくお願いします。
Zuishin

2019/07/11 11:50

終わってから言わないでくださいな。また始まるでしょ。
Zuishin

2019/07/11 11:51

ここは回答のコメントをするところなので、火に油を注ぎたいなら、他へどうぞ。
Zuishin

2019/07/11 17:14

低評価 2 の回答と同意文なので低評価しました。
guest

0

char* box[30];
だと、box[0] からbox[29]までです。それ超えると範囲外になりますね


んで、Cでコードを組むなら、VisualStudioやEclipseなど、デバッグできる環境を整えましょう
ソースコードの任意の行で実行を止め、変数のナカミを見ることができます。
また、1行づつ実行したりできますんで、当てずっぽでコードを組まなくて済むようになります

投稿2019/07/11 07:05

編集2019/07/11 07:08
y_waiwai

総合スコア87747

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

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

hermes

2019/07/11 07:13

ありがとうございます.デバッグ環境も整えていきたいと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問