現状説明
txtの情報を連結リストに格納して、郵便番号を入力するとその郵便番号と住所と何件表示されたかを出力するプログラムを作っています。
実行すると
郵便番号を入力してください:0
プログラムを終了します
%
上のように2回目以降0件見つかりましたと検索できなくなります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/27 17:36
2020/07/28 04:45
回答4件
0
C
1int main(int argc, char* argv[]) { 2 char* n = NULL; 3 ... 4 infile_scanf("%s", n); /*=scanf*/
infile_scanfとやらが"ファイルを入力源とするscanf"だとすると、
ファイルから文字列を読みだして n に収めてくれるのかな。
ところが n = NULL だから文字列を収める領域がどこにもない。セングメントエラーとなるのも無理はない。
投稿2020/07/27 23:33
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/28 05:22
2020/07/28 07:14
2020/07/28 09:59
2020/07/28 10:15
2020/07/28 11:20
2020/07/28 11:44
2020/07/28 15:40
0
ベストアンサー
C言語のポインタ変数は、アドレスの場所を格納するだけで、その先の領域がどうなっているかは関知しません。
char *n = 0;
とした場合、nにはアドレスとして0が格納されますが、0番地のメモリアドレスの権利を確保する訳ではありません。
infile_scanf("%s", n);
これが、nの指す先にデータを書き込む関数であるとするならば、確保していないアドレス(0番地)に勝手にデータを書き込むので、エラーになって落ちます。
配列等で領域を確保して、そのアドレスをポインタに代入するか、malloc等で動的にデータを書き込む領域を確保して、そのアドレスを渡してください。
そのほか、a,b,c等のポインタ変数も同様です。
ポインタ変数は宣言しただけでは、領域は確保されません。
例えばこんな風にするとか。
C
1// char *n = 0; 2 char n[20]; 3 4// char *a = 0, *b = 0, *c = 0; 5 char a[8], b[205], c[106];
追加?
C
1 while(strcmp(pos,"0") != 0){ /*0が入力されるまで検索を続ける*/ 2 3// 省略 4 5 printf("%d件見つかりました",flag); 6 7 infile_scanf("%s", pos); 8 9 }
この最後のinfile_scanf("%s", pos);
は何でしょう?
前半でファイルの読み込みは終わっているはずなのに、これでさらに読み込んでエラーが出る。
そのまま、whileに戻って、posの値は(おそらく)書き換わらないので、whileは回り続けて
無限ループとなり、エラーが出続ける。
のだと思います。
投稿2020/07/28 07:31
編集2020/07/28 12:09総合スコア1218
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/28 10:14
2020/07/28 10:25
2020/07/28 11:16
2020/07/28 11:29
2020/07/28 11:46
2020/07/28 15:37 編集
2020/07/28 15:39
0
infile_scanfもstrcpyもどちらもSEGVですね。
→ポインタ変数a,b,cどれもNULLポインタですから。
構造体ポインタpはちゃんとmallocでメモリ割り当てしているのに、なぜa,b,cには
メモリ実体を割り当てていないのでしょうか?
自分ではこれでちゃんと動くと思うのですが
動きませんよ。
配列とポインタをもっと学習しましょう!
投稿2020/07/28 01:57
総合スコア1095
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/28 05:16
2020/07/28 06:28 編集
2020/07/28 10:15
2020/07/28 15:40
0
セグメントエラーというのは、どこかでメモリ破壊やアクセス違反が起こっているときに出ます
提示のコードはそのままではコンパイルができません。また、定義がない関数もあるようです。
まずは、こちらでコピペできちんと動作するコードを提示しましょう。
投稿2020/07/27 21:38
総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/28 05:26
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。