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

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

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

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

Q&A

解決済

1回答

1577閲覧

ダウンロードしたプログラムでエラーが出て実行できない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/12/03 02:51

編集2017/12/03 02:52

ダウンロードしたプログラムでエラーが出て実行できない。
URLはcodepad.org/B83f1FSq です。セグメンテーション違反が出ています。
ダウンロードしたプログラムに名前を付けて保存して実行しています。
debug結果(デバッグとは言えないと言われそうですが)は以下のとおりです。ここから前に進まない状態です。どこが悪いのかおしえていただければありがたいのですが。
お願いいたします。
naka@naka ~/kadai
$ gcc -g kad9-8-2c.c -Wall

naka@naka ~/kadai
$ gdb a.exe
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "mingw32".
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from C:\MinGW\msys\1.0\home\nakamura\kadai\a.exe...done.

(gdb) b main
Breakpoint 1 at 0x401b34: file kad9-8-2c.c, line 184.
(gdb) r
Starting program: C:\MinGW\msys\1.0\home\nakamura\kadai/a.exe
[New Thread 5180.0x32f4]
[New Thread 5180.0x28dc]
[New Thread 5180.0x12d0]
[New Thread 5180.0x4c8]
[New Thread 5180.0x33b0]
[New Thread 5180.0x1dd8]
[New Thread 5180.0xf14]

Breakpoint 1, main () at kad9-8-2c.c:184
184 char *token=",";
(gdb) step
187 head = 0;
(gdb)
188 if ((fp = fopen(FILENAME,"r")) != 0) {
(gdb)
189 while(fgets(buff, N, fp) != 0){
(gdb)
190 chop(buff);
(gdb)
chop (p=0x408120 <buff.2666> "naka") at kad9-8-2c.c:26
26 for (; *p; p++)
(gdb)
28 p--;
(gdb)
29 while (*p == '\r' || *p == '\n')
(gdb)
31 }
(gdb)
main () at kad9-8-2c.c:191
191 strcpy(name, strtok(buff, token));
(gdb)
192 strcpy(address, strtok(NULL, token));
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x74245623 in strcat () from C:\WINDOWS\SysWOW64\msvcrt.dll
(gdb)
Single stepping until exit from function strcat,
which has no line number information.

Program received signal SIGSEGV, Segmentation fault.
0x74245623 in strcat () from C:\WINDOWS\SysWOW64\msvcrt.dll
(gdb)
Single stepping until exit from function strcat,
which has no line number information.
[Inferior 1 (process 5180) exited with code 030000000005]
(gdb)
The program is not being run.
(gdb)

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

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

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

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

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

guest

回答1

0

ベストアンサー

192 strcpy(address, strtok(NULL, token));

のstrtok()関数の戻り値がNULLになってませんか?
buffの中身または、"address.csv"の内容が正しいか確認してください。

追記

c

1if ((fp = fopen(FILENAME,"r")) != 0) { 2 while(fgets(buff, N, fp) != 0){ 3 char *p; 4 chop(buff); 5 printf( "ファイルから読んだ文字列:%s\n", buff ); 6 p = strtok(buff, token); 7 if ( p != NULL ) { 8 strcpy(name, p); 9 } else { 10 printf( "nameの切り出しに失敗しました。\n"); 11 continue; 12 } 13 p = strtok(NULL, token); 14 if ( p != NULL ) { 15 strcpy(address, p); 16 } else { 17 printf( "addressの切り出しに失敗しました。\n"); 18 continue; 19 } 20 p = strtok(NULL, token); 21 if ( p != NULL ) { 22 strcpy(number, p); 23 } else { 24 printf( "numberの切り出しに失敗しました。\n"); 25 continue; 26 } 27 p = strtok(NULL, token); 28 if ( p != NULL ) { 29 strcpy(mail, p); 30 } else { 31 printf( "mailの切り出しに失敗しました。\n"); 32 continue; 33 } 34 list_add(&head, name, address, number, mail); 35 } 36 fclose(fp); 37}

投稿2017/12/03 03:18

編集2017/12/03 06:51
TaroToyotomi

総合スコア1430

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

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

退会済みユーザー

退会済みユーザー

2017/12/03 04:28

"address.csv"の内容が間違っていました。修正して実行するとlist_add()はすべて実行されて、while{}から抜けるはずですが、抜けないでじっこうがはじまるみたいです。そしてまた同じようなエラーになります。 つぎにメニューを選択してwhile{}に実行に移ることにならなければいけないと思います。よろしくおねがいいたします。判断材料が足りなければおしゃってください。 main () at kad9-8-2a.c:244 244 while(fgets(buff, N, fp) != 0){ (gdb) 245 chop(buff); (gdb) chop ( p=0x408120 <buff.2666> ' ' <repeats 141 times>, "P 5432", ' ' <repeats 51 times>...) at kad9-8-2a.c:37 37 for (; *p; p++) (gdb) 58 p--; (gdb) 59 while (*p == '\r' || *p == '\n') (gdb) 61 } (gdb) main () at kad9-8-2a.c:247 247 strcpy(number, strtok(buff, token)); (gdb) 248 strcpy(name, strtok(NULL, token)); (gdb) Program received signal SIGSEGV, Segmentation fault. 0x74245623 in strcat () from C:\WINDOWS\SysWOW64\msvcrt.dll (gdb)
TaroToyotomi

2017/12/03 06:49 編集

セグメンテーションフォルトが発生している直接原因は理解していますか? 追記のようにコードを直して、期待通りに文字列の切り出しが成功しているか確認してください。
退会済みユーザー

退会済みユーザー

2017/12/03 07:24

ありがとうございます。一応メニューが表示されました。途中に以下の表示が40個ぐらい表示された後に メニューが表示されます。なんででしょうか。 naka@naka ~/kadai $ kad9-8-3a ファイルから読んだ文字列:naka,kamikosaka,080-4444,mail1-1 ファイルから読んだ文字列:kato,kanagawa,080-8888,mail1-2 ファイルから読んだ文字列:saito,yamanashi,080-6666,mail1-3 ファイルから読んだ文字列:sato,tokyo ,090-3333,mail1-4 ファイルから読んだ文字列:suzuki,saitama,090-2222,mail1-5 ファイルから読んだ文字列: P 5432 naka addressの切り出しに失敗しました。 ファイルから読んだ文字列: P 5432 addressの切り出しに失敗しました。 ファイルから読んだ文字列: ...... addressの切り出しに失敗しました。 ファイルから読んだ文字列: addressの切り出しに失敗しました。 1:sort 2:delete 3:add 4:dump 0:quit select menu: 3 input data to add. name: nasi address: oosaka tel: 6789 mail: h-mail
退会済みユーザー

退会済みユーザー

2017/12/03 07:31

できました。continueをbreakに直させていただきました。1歩前進しました。 これから住所プログラム読みたいと思います。ありがとうございました。
TaroToyotomi

2017/12/03 14:46

breakに直しただけだとファイルの読み込みを途中でやめただけで本質的には改善してないと思いますが・・・。
退会済みユーザー

退会済みユーザー

2017/12/04 01:11

ありがとうございます。一応すべてのメニューを試して正常に動いたのですが、間違っていますか。 同じようなコードでエラーが出て実行できない状態なので、質問を新たにしたいと思います。そちらでまた教えてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問