teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

書式の改善

2020/07/28 18:22

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
File without changes
body CHANGED
@@ -6,17 +6,4 @@
6
6
  プログラムを終了します
7
7
  %
8
8
 
9
- 上のように2回目以降0件見つかりましたと検索できなくなります。
9
+ 上のように2回目以降0件見つかりましたと検索できなくなります。
10
-
11
-
12
-
13
- ```txt
14
- 3
15
- 1000011 東京都千代田区内幸町 TOKYOTOCHIYODAKUUCHISAIWAICHO
16
- 5730171 大阪府枚方市北山 OSAKAFUHIRAKATASHIKITAYAMA
17
- 0040021 北海道札幌市厚別区青葉町 HOKKAIDOSAPPOROSHIATSUBETSUKUAOBACHO
18
- ```
19
-
20
- ###開発環境
21
- bush :シェルスクリプト
22
- sakura editer :編集

6

書式の改善

2020/07/28 18:22

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
File without changes
body CHANGED
@@ -2,17 +2,6 @@
2
2
  txtの情報を連結リストに格納して、郵便番号を入力するとその郵便番号と住所と何件表示されたかを出力するプログラムを作っています。
3
3
  実行すると
4
4
 
5
- % ./main.exe test.txt
6
- 1000011 東京都千代田区内幸町
7
- 5730171 大阪府枚方市北山
8
- 0040021 北海道札幌市厚別区青葉町
9
- 郵便番号を入力してください:5730171
10
- 5730171 大阪府枚方市北山
11
- 1件見つかりました
12
- 郵便番号を入力してください:1000011
13
- 0件見つかりました
14
- 郵便番号を入力してください:9999999
15
- 0件見つかりました
16
5
  郵便番号を入力してください:0
17
6
  プログラムを終了します
18
7
  %

5

書式の改善

2020/07/28 18:21

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
File without changes
body CHANGED
@@ -19,174 +19,8 @@
19
19
 
20
20
  上のように2回目以降0件見つかりましたと検索できなくなります。
21
21
 
22
- 説明不足な箇所があれば教えてください。説明します。
23
22
 
24
23
 
25
- ```C
26
- #include <stdio.h>
27
- #include <stdlib.h>
28
- #include <string.h>
29
- #include "library.h"
30
-
31
- struct address {
32
- char no[8]; /*郵便番号*/
33
- char addr[205]; /*住所*/
34
- char yomi[106]; /*読みがな*/
35
- struct address *next;/*次のリストのアドレス*/
36
- };
37
-
38
- struct address gFront = {{0}, {0}, {0}, NULL}; /*先頭の連結リストを指すポインタの初期化*/
39
-
40
- void printList(void){ /*ちゃんと格納されているか確認するため*/
41
- struct address *p;
42
-
43
- printf("LIST[ ");
44
- p = gFront.next;
45
- while(p != NULL){
46
- printf("%s, %s, %s, ",p->no, p->addr, p->yomi);
47
- p = p->next;
48
- }
49
- printf("]\n");
50
- }
51
-
52
- void insert(struct address *pre, struct address *new){ /*後ろに連結させる*/
53
- new->next = NULL;
54
- pre->next = new;
55
- }
56
-
57
- void print_address(struct address *p){ /*郵便番号と住所を表示*/
58
- printf("%s %s\n",p->no, p->addr);
59
- }
60
-
61
- int main(int argc, char *argv[]){
62
- char n[124270];
63
- char pos[8];
64
- char a[8], b[205], c[106];
65
- struct address *p;
66
- struct address *tail;
67
- int N, i, flag=0;
68
-
69
-
70
- if (argc != 2){
71
- fprintf(stderr, "プログラム引数を 1 つ指定してください\n");
72
- exit(1);
73
- }
74
-
75
- /*=======txtの情報を連結リストへ========*/
76
-
77
- infile_open(argv[1]); /*プログラム引数で呼び出されたtxtファイルを読む準備*/
78
-
79
- infile_scanf("%s", n); /*=scanf*/
80
- N = atoi(n);
81
- tail = &gFront; /*初期化:連結リストの末尾が先頭を指すポインタのアドレスを示している*/
82
-
83
- for(i = 0; i < N; i++){
84
- infile_scanf("%s", a); /*addressの3メンバをスキャンし、*/
85
- infile_scanf("%s", b);
86
- infile_scanf("%s", c);
87
-
88
- p = malloc(sizeof(struct address));
89
- if (p == NULL){
90
- fprintf(stderr, "エラー: malloc失敗\n");
91
- exit(1);
92
- }
93
-
94
- strcpy(p->no, a); /*pが指すリストへ格納する*/
95
- strcpy(p->addr, b);
96
- strcpy(p->yomi, c);
97
-
98
- insert(tail, p); /*それを末尾に連結させる*/
99
- tail = p;
100
- print_address(p);
101
- }
102
-
103
- /*==========================郵便番号を捜査===============================*/
104
-
105
- printf("郵便番号を入力してください:");
106
- scanf("%s",pos);
107
- p = gFront.next;
108
-
109
- while(strcmp(pos,"0") != 0){
110
-
111
- while(p != NULL){
112
- if(strcmp(pos, p->no) == 0){
113
- print_address(p);
114
- flag++;
115
- }
116
- p = p->next;
117
- }
118
-
119
- printf("%d件見つかりました\n",flag);
120
-
121
- flag = 0;
122
- printf("郵便番号を入力してください:");
123
- scanf("%s", pos);
124
-
125
- }
126
- infile_close();
127
- printf("プログラムを終了します\n");
128
-
129
-
130
-
131
- return 0;
132
- }
133
- ```
134
-
135
- ```library
136
- /* 引数に与えたファイル名のファイルを入力用として内部に開いておく. */
137
- void infile_open(char *filename){
138
- static int opennum = 0;
139
- if (InputFileFp != NULL){
140
- fprintf(stderr, "エラー: infile_open: 既にファイルを開いています.\n");
141
- fprintf(stderr, " 2重に開くことはできません.\n");
142
- exit(1);
143
- }
144
-
145
- if (opennum > 0){
146
- fprintf(stderr, "エラー: infile_open: ファイルを開けるのは1回だけです.\n");
147
- exit(1);
148
- }
149
-
150
- InputFileFp = fopen(filename, "r");
151
- if (InputFileFp == NULL){
152
- fprintf(stderr, "エラー: infile_open: '%s'を開けませんでした.\n", filename);
153
- fprintf(stderr, " ファイルが無いかスペルミスしていませんか?\n");
154
- exit(1);
155
- }
156
- opennum++;
157
- }
158
-
159
-
160
- /* 開いておいた入力ファイルからscanfする.戻り値はscanfと同じ. */
161
- int infile_scanf(char *format, ...){
162
- static int eof_read_cnt=0;
163
- int ret;
164
- va_list ap;
165
-
166
- va_start(ap, format);
167
- ret = vfscanf(InputFileFp, format, ap);
168
- va_end(ap);
169
-
170
- if (ret == EOF){
171
- if (eof_read_cnt++ >= 2){
172
- fprintf(stderr, "警告: infile_scanf: すでにファイルの終端に達していますが\n");
173
- fprintf(stderr, " 複数回scanfしようとしています\n");
174
- }
175
- }
176
-
177
- return ret;
178
- }
179
-
180
-
181
- /* 開いておいた入力ファイルを閉じる. */
182
- void infile_close(void){
183
- if (InputFileFp != NULL){
184
- fclose(InputFileFp);
185
- InputFileFp = NULL;
186
- }
187
- }
188
- ```
189
-
190
24
  ```txt
191
25
  3
192
26
  1000011 東京都千代田区内幸町 TOKYOTOCHIYODAKUUCHISAIWAICHO

4

flagの初期化修正

2020/07/28 15:40

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
File without changes
body CHANGED
@@ -6,21 +6,21 @@
6
6
  1000011 東京都千代田区内幸町
7
7
  5730171 大阪府枚方市北山
8
8
  0040021 北海道札幌市厚別区青葉町
9
+ 郵便番号を入力してください:5730171
10
+ 5730171 大阪府枚方市北山
11
+ 1件見つかりました
12
+ 郵便番号を入力してください:1000011
13
+ 0件見つかりました
14
+ 郵便番号を入力してください:9999999
15
+ 0件見つかりました
9
- 郵便番号を入力してください:
16
+ 郵便番号を入力してください:0
17
+ プログラムを終了します
18
+ %
10
19
 
11
- まではいいのでが1000011を入力すると
20
+ 上のように2回目以降0件見つかりしたと検索きなくなりま
12
21
 
13
- 警告: infile_scanf: すでにファイルの終端に達していますが
14
- 複数回scanfしようとしています
15
- 警告: infile_scanf: すでにファイルの終端に達していますが
16
- 複数回scanfしようとしています
17
- ▒▒かりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました
18
-
19
- のようなエラーがエンドレスで出てきてしまいます。
20
-
21
22
  説明不足な箇所があれば教えてください。説明します。
22
23
 
23
- ![イメージ説明](4c293c2b955e7d75f28c3e76df8cb904.png)
24
24
 
25
25
  ```C
26
26
  #include <stdio.h>
@@ -37,6 +37,18 @@
37
37
 
38
38
  struct address gFront = {{0}, {0}, {0}, NULL}; /*先頭の連結リストを指すポインタの初期化*/
39
39
 
40
+ void printList(void){ /*ちゃんと格納されているか確認するため*/
41
+ struct address *p;
42
+
43
+ printf("LIST[ ");
44
+ p = gFront.next;
45
+ while(p != NULL){
46
+ printf("%s, %s, %s, ",p->no, p->addr, p->yomi);
47
+ p = p->next;
48
+ }
49
+ printf("]\n");
50
+ }
51
+
40
52
  void insert(struct address *pre, struct address *new){ /*後ろに連結させる*/
41
53
  new->next = NULL;
42
54
  pre->next = new;
@@ -60,7 +72,7 @@
60
72
  exit(1);
61
73
  }
62
74
 
63
- /*=======txtの情報を連結リストへ========リストへの格納は動作確認済み*/  
75
+ /*=======txtの情報を連結リストへ========*/
64
76
 
65
77
  infile_open(argv[1]); /*プログラム引数で呼び出されたtxtファイルを読む準備*/
66
78
 
@@ -88,31 +100,34 @@
88
100
  print_address(p);
89
101
  }
90
102
 
91
- /*========郵便番号を捜査============*/
103
+ /*==========================郵便番号を捜査===============================*/
92
104
 
93
105
  printf("郵便番号を入力してください:");
94
106
  scanf("%s",pos);
95
-
96
107
  p = gFront.next;
97
108
 
98
- while(strcmp(pos,"0") != 0){     /*0が入力されるまで検索を続ける*/
109
+ while(strcmp(pos,"0") != 0){
99
110
 
100
- while(p != NULL){             /*リストの最後まで*/
111
+ while(p != NULL){
101
- if(strcmp(pos, p->no) == 0){     
112
+ if(strcmp(pos, p->no) == 0){
102
113
  print_address(p);
103
- flag++; /該当するものがあったらflagを増やす/
114
+ flag++;
104
115
  }
105
116
  p = p->next;
106
117
  }
107
118
 
108
- printf("%d件見つかりました",flag);
119
+ printf("%d件見つかりました\n",flag);
109
120
 
121
+ flag = 0;
122
+ printf("郵便番号を入力してください:");
110
- infile_scanf("%s", pos);
123
+ scanf("%s", pos);
111
124
 
112
125
  }
113
126
  infile_close();
114
- printf("プログラムを終了します");
127
+ printf("プログラムを終了します\n");
128
+
115
129
 
130
+
116
131
  return 0;
117
132
  }
118
133
  ```

3

新しくつまずいたところを追加

2020/07/28 15:28

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
@@ -1,1 +1,1 @@
1
- txtの情報を連結リストに格納したセグメントエラーで詰んで
1
+ 連結リストで該当したものをprintしなら捜査をつづけた
body CHANGED
@@ -1,13 +1,23 @@
1
1
  ### 現状説明
2
- txtの情報を連結リストに格納したいのでが以下ようにプログラムした
2
+ txtの情報を連結リストに格納して、郵便番号を入力るとそ郵便番号と住所と何件表示されたかを出力するプログラムを作ってい
3
- コンパイルは成功したのですが、実行するとセグメントエラーとなりました。
3
+ 実行すると
4
4
 
5
5
  % ./main.exe test.txt
6
+ 1000011 東京都千代田区内幸町
7
+ 5730171 大阪府枚方市北山
8
+ 0040021 北海道札幌市厚別区青葉町
6
- セグメントエラー
9
+ 郵便番号を入力してください:
7
10
 
8
- 修正するヒントがないので詰まってま
11
+ まではのですが1000011を入力すると
9
- printfをちりばめてもセグメントエラーです。
10
12
 
13
+ 警告: infile_scanf: すでにファイルの終端に達していますが
14
+ 複数回scanfしようとしています
15
+ 警告: infile_scanf: すでにファイルの終端に達していますが
16
+ 複数回scanfしようとしています
17
+ ▒▒かりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました0件見つかりました
18
+
19
+ のようなエラーがエンドレスで出てきてしまいます。
20
+
11
21
  説明不足な箇所があれば教えてください。説明します。
12
22
 
13
23
  ![イメージ説明](4c293c2b955e7d75f28c3e76df8cb904.png)
@@ -16,7 +26,7 @@
16
26
  #include <stdio.h>
17
27
  #include <stdlib.h>
18
28
  #include <string.h>
19
- #include "libraly.h" /*infile_open、infile_close、 infile_scanfはlibraly.hから提供されているもので間違ってはないです*/
29
+ #include "library.h"
20
30
 
21
31
  struct address {
22
32
  char no[8]; /*郵便番号*/
@@ -27,18 +37,6 @@
27
37
 
28
38
  struct address gFront = {{0}, {0}, {0}, NULL}; /*先頭の連結リストを指すポインタの初期化*/
29
39
 
30
- void printList(void){ /*ちゃんと格納されているか確認するため*/
31
- struct address *p;
32
-
33
- printf("LIST[ ");
34
- p = gFront.next;
35
- while(p != NULL){
36
- printf("%s, %s, %s, ",p->no, p->addr, p->yomi);
37
- p = p->next;
38
- }
39
- printf("]\n");
40
- }
41
-
42
40
  void insert(struct address *pre, struct address *new){ /*後ろに連結させる*/
43
41
  new->next = NULL;
44
42
  pre->next = new;
@@ -49,11 +47,12 @@
49
47
  }
50
48
 
51
49
  int main(int argc, char *argv[]){
50
+ char n[124270];
52
- char *n = 0;
51
+ char pos[8];
53
- char *a = 0, *b = 0, *c = 0;
52
+ char a[8], b[205], c[106];
54
53
  struct address *p;
55
54
  struct address *tail;
56
- int N, i;
55
+ int N, i, flag=0;
57
56
 
58
57
 
59
58
  if (argc != 2){
@@ -61,7 +60,7 @@
61
60
  exit(1);
62
61
  }
63
62
 
64
- /*=======txtの情報を連結リストへ========*/
63
+ /*=======txtの情報を連結リストへ========リストへの格納は動作確認済み*/  
65
64
 
66
65
  infile_open(argv[1]); /*プログラム引数で呼び出されたtxtファイルを読む準備*/
67
66
 
@@ -83,17 +82,96 @@
83
82
  strcpy(p->no, a); /*pが指すリストへ格納する*/
84
83
  strcpy(p->addr, b);
85
84
  strcpy(p->yomi, c);
86
-
85
+
87
86
  insert(tail, p); /*それを末尾に連結させる*/
88
87
  tail = p;
89
- printList();
88
+ print_address(p);
90
89
  }
90
+
91
+ /*========郵便番号を捜査============*/
92
+
93
+ printf("郵便番号を入力してください:");
94
+ scanf("%s",pos);
95
+
96
+ p = gFront.next;
97
+
98
+ while(strcmp(pos,"0") != 0){     /*0が入力されるまで検索を続ける*/
99
+
91
-    infile_close();          /*参照したtxtファイルを閉じる*/
100
+ while(p != NULL){             /*リストの最後まで*/
92
-
101
+ if(strcmp(pos, p->no) == 0){     
102
+ print_address(p);
103
+ flag++; /該当するものがあったらflagを増やす/
104
+ }
105
+ p = p->next;
106
+ }
107
+
108
+ printf("%d件見つかりました",flag);
109
+
110
+ infile_scanf("%s", pos);
111
+
112
+ }
113
+ infile_close();
114
+ printf("プログラムを終了します");
115
+
93
116
  return 0;
94
117
  }
95
118
  ```
96
119
 
120
+ ```library
121
+ /* 引数に与えたファイル名のファイルを入力用として内部に開いておく. */
122
+ void infile_open(char *filename){
123
+ static int opennum = 0;
124
+ if (InputFileFp != NULL){
125
+ fprintf(stderr, "エラー: infile_open: 既にファイルを開いています.\n");
126
+ fprintf(stderr, " 2重に開くことはできません.\n");
127
+ exit(1);
128
+ }
129
+
130
+ if (opennum > 0){
131
+ fprintf(stderr, "エラー: infile_open: ファイルを開けるのは1回だけです.\n");
132
+ exit(1);
133
+ }
134
+
135
+ InputFileFp = fopen(filename, "r");
136
+ if (InputFileFp == NULL){
137
+ fprintf(stderr, "エラー: infile_open: '%s'を開けませんでした.\n", filename);
138
+ fprintf(stderr, " ファイルが無いかスペルミスしていませんか?\n");
139
+ exit(1);
140
+ }
141
+ opennum++;
142
+ }
143
+
144
+
145
+ /* 開いておいた入力ファイルからscanfする.戻り値はscanfと同じ. */
146
+ int infile_scanf(char *format, ...){
147
+ static int eof_read_cnt=0;
148
+ int ret;
149
+ va_list ap;
150
+
151
+ va_start(ap, format);
152
+ ret = vfscanf(InputFileFp, format, ap);
153
+ va_end(ap);
154
+
155
+ if (ret == EOF){
156
+ if (eof_read_cnt++ >= 2){
157
+ fprintf(stderr, "警告: infile_scanf: すでにファイルの終端に達していますが\n");
158
+ fprintf(stderr, " 複数回scanfしようとしています\n");
159
+ }
160
+ }
161
+
162
+ return ret;
163
+ }
164
+
165
+
166
+ /* 開いておいた入力ファイルを閉じる. */
167
+ void infile_close(void){
168
+ if (InputFileFp != NULL){
169
+ fclose(InputFileFp);
170
+ InputFileFp = NULL;
171
+ }
172
+ }
173
+ ```
174
+
97
175
  ```txt
98
176
  3
99
177
  1000011 東京都千代田区内幸町 TOKYOTOCHIYODAKUUCHISAIWAICHO

2

イメージ図の挿入

2020/07/28 11:37

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
File without changes
body CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  説明不足な箇所があれば教えてください。説明します。
12
12
 
13
- 自分ではこれでちゃんと動くと思うのですが....
13
+ ![イメージ説明](4c293c2b955e7d75f28c3e76df8cb904.png)
14
14
 
15
15
  ```C
16
16
  #include <stdio.h>

1

修正依頼に対応,main内のchar型のa,b,c,nの初期化をNULLから0に

2020/07/28 10:17

投稿

German_p0tat0
German_p0tat0

スコア26

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,10 @@
1
1
  ### 現状説明
2
2
  txtの情報を連結リストに格納したいのですが以下のようにプログラムしました。
3
3
  コンパイルは成功したのですが、実行するとセグメントエラーとなりました。
4
+
5
+ % ./main.exe test.txt
6
+ セグメントエラー
7
+
4
8
  修正するヒントがないので詰まってます。
5
9
  printfをちりばめてもセグメントエラーです。
6
10
 
@@ -9,11 +13,16 @@
9
13
  自分ではこれでちゃんと動くと思うのですが....
10
14
 
11
15
  ```C
16
+ #include <stdio.h>
17
+ #include <stdlib.h>
18
+ #include <string.h>
19
+ #include "libraly.h" /*infile_open、infile_close、 infile_scanfはlibraly.hから提供されているもので間違ってはないです*/
20
+
12
21
  struct address {
13
- char no[8];   /*郵便番号*/
22
+ char no[8]; /*郵便番号*/
14
- char addr[205];   /*住所*/
23
+ char addr[205]; /*住所*/
15
- char yomi[106];    /*読みがな*/
24
+ char yomi[106]; /*読みがな*/
16
- struct address *next;  /*次のリストのアドレス*/
25
+ struct address *next;/*次のリストのアドレス*/
17
26
  };
18
27
 
19
28
  struct address gFront = {{0}, {0}, {0}, NULL}; /*先頭の連結リストを指すポインタの初期化*/
@@ -39,12 +48,9 @@
39
48
  printf("%s %s\n",p->no, p->addr);
40
49
  }
41
50
 
42
-
43
-
44
-
45
51
  int main(int argc, char *argv[]){
46
- char *n = NULL;
52
+ char *n = 0;
47
- char *a = NULL, *b = NULL, *c = NULL;
53
+ char *a = 0, *b = 0, *c = 0;
48
54
  struct address *p;
49
55
  struct address *tail;
50
56
  int N, i;
@@ -82,6 +88,7 @@
82
88
  tail = p;
83
89
  printList();
84
90
  }
91
+    infile_close();          /*参照したtxtファイルを閉じる*/
85
92
 
86
93
  return 0;
87
94
  }
@@ -92,4 +99,8 @@
92
99
  1000011 東京都千代田区内幸町 TOKYOTOCHIYODAKUUCHISAIWAICHO
93
100
  5730171 大阪府枚方市北山 OSAKAFUHIRAKATASHIKITAYAMA
94
101
  0040021 北海道札幌市厚別区青葉町 HOKKAIDOSAPPOROSHIATSUBETSUKUAOBACHO
95
- ```
102
+ ```
103
+
104
+ ###開発環境
105
+ bush :シェルスクリプト
106
+ sakura editer :編集