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

質問編集履歴

1

2021/12/24 18:14

投稿

sinn1204
sinn1204

スコア7

title CHANGED
@@ -1,1 +1,1 @@
1
- 住所検索について出力結果が上手くいかない
1
+ 解決しました、、、、、
body CHANGED
@@ -1,222 +1,11 @@
1
- ### 前提・実現したいこと
1
+ **
2
- c言語で郵便番号による住所検索と住所の一部の文字列による住所検索を実装。
2
+ __
3
3
 
4
- ### 発生している問題・エラーメッセージ
4
+ ###
5
-
6
5
  ```
7
-
8
- 郵便番号が5000000を上回ると結果として出力されないエラーが生じております。
9
-
10
6
  ```
11
7
 
12
- ### 該当のソースコード
13
- c言語
8
+ コード
14
9
  ```
15
-
16
- #include<stdio.h>
17
- #include<stdlib.h>
18
- #include<string.h>
19
- #include <time.h>
20
-
21
- #define ADVANCED 0 //発展課題(絞り込み検索)に対応する場合は1に変更
22
-
23
- #define DATAFILE "data_sjis.csv" //data_utf.csvかdata_sjis.csvに変更
24
- #define CLEN 9 //郵便番号の最大バイト長
25
- #define ALEN 200 //住所欄の最大バイト長
26
- #define MAX_SIZE 200000//住所録中の住所数の最大数
27
-
28
- int mode; //検索モード 0:なし,1:郵便番号検索,2:文字列検索
29
- int refine_flag; //絞り込み検索の有無 0:なし,1:あり
30
- char query[ALEN]; //検索クエリ(郵便番号or文字列)
31
- long line=0;
32
-
33
- typedef struct{
34
- int CODE;
35
- char PREF[ALEN+1];
36
- char CITY[ALEN+1];
37
- char TOWN[ALEN+1];
38
- }add;
39
- add ad[MAX_SIZE];
40
-
41
- //”をとばす
42
- void quotation(char a[],int n){
43
- for (int i = 0; i < n; i++){
44
- if(a[i] == '"'){
45
- for (int j = i; j < n; j++){
46
- a[j] = a[j+1];
47
- }
48
-
49
- }
50
- }
51
- }
52
-
53
- //住所データファイルを読み取り,配列に保存
54
- void scan(){
55
- FILE *fp;
56
- char code[CLEN+1];
57
-
58
- //datasizeの計算
59
- if ((fp = fopen(DATAFILE, "r")) == NULL) {
60
- fprintf(stderr,"error:cannot read %s\n",DATAFILE);
61
- exit(-1);
62
- }
63
- while(fscanf(fp, "%*[^,],%*[^,],%[^,],%*[^,],%*[^,],%*[^,],%[^,],%[^,],%[^,],%*s",code,ad[line].PREF,ad[line].CITY,ad[line].TOWN) != EOF ){
64
- quotation(code,CLEN+1);
65
- quotation(ad[line].PREF,ALEN+1);
66
- quotation(ad[line].CITY,ALEN+1);
67
- quotation(ad[line].TOWN,ALEN+1);
68
- ad[line].CODE=atoi(code);
69
- line++;
70
- }
71
- printf("%ld行の住所があります\n",line);
72
- fclose(fp);
73
- }
74
-
75
- int cmpAsccode(const void * n1, const void * n2)
76
- {
77
- if (((add *)n1)->CODE > ((add *)n2)->CODE)
78
- {
79
- return 1;
80
- }
81
- else if (((add *)n1)->CODE < ((add *)n2)->CODE)
82
- {
83
- return -1;
84
- }
85
- else
10
+ コード
86
- {
87
- return 0;
88
- }
89
- }
90
-
91
- //昇順に並べる
92
- void preprocess(){
93
- qsort(ad, sizeof(ad) / sizeof(ad[0]), sizeof(add), cmpAsccode);
94
- return;
95
- }
96
-
97
- double diff_time(clock_t t1, clock_t t2){
98
- return (double) (t2-t1)/CLOCKS_PER_SEC;
99
- }
100
-
101
- //初期化処理
102
- void init(){
103
- clock_t t1,t2;
104
-
105
- t1 = clock();
106
- scan();
107
- preprocess();
108
- printf("Done initilization\n");
109
- t2 = clock();
110
- printf("\n### %f sec for initialization. ###\n",diff_time(t1,t2));
111
- }
112
-
113
- //郵便番号による住所検索.検索結果を出力.
114
- void code_search(){
115
- int QUERY = atoi(query);
116
- for(int i=0;i<=line;i++){
117
- if(QUERY == ad[i].CODE){
118
- printf("%d:%s%s%s\n",ad[i].CODE,ad[i].PREF,ad[i].CITY,ad[i].TOWN);
119
- }else if(QUERY < ad[i].CODE){
120
- break;
121
- }
122
- }
123
- return;
124
- }
125
-
126
- //文字列による住所検索.検索結果を出力.
127
- void address_search(){
128
- char *adr1,*adr2,*adr3;
129
-
130
- for(int j=0;j<=line;j++){
131
- adr1 = strstr(ad[j].PREF,query);
132
- adr2 = strstr(ad[j].CITY,query);
133
- adr3 = strstr(ad[j].TOWN,query);
134
- if(adr1 != NULL||adr2 != NULL||adr3 != NULL)printf("%d:%s%s%s\n",ad[j].CODE,ad[j].PREF,ad[j].CITY,ad[j].TOWN);
135
- }
136
- return;
137
- }
138
-
139
- //絞り込み検索の実施
140
- void refinement(){
141
- return;
142
- }
143
-
144
- void input(){
145
- printf("\n"
146
- "#########Top Menu#########\n"
147
- "# Search by postal code: 1\n"
148
- "# Search by address : 2\n"
149
- "# Exit : 0\n"
150
- "> ");
151
- scanf("%d", &mode);
152
- if(mode == 1){
153
- printf("Postal code > ");
154
- scanf("%s", query);
155
- }else if(mode == 2){
156
- printf("Search String > ");
157
- scanf("%s", query);
158
- }
159
- }
160
-
161
- //絞り込み検索の有無を確認
162
- void re_input(){
163
- printf("\n"
164
- "# Continue Searching: 1\n"
165
- "# Return to Top Menu: 0\n"
166
- "> ");
167
- scanf("%d", &refine_flag);
168
- if(refine_flag == 1){
169
- printf("String for Refinement> ");
170
- scanf("%s", query);
171
- }
172
- return;
173
- }
174
-
175
- //クエリへの応答
176
- void respond(){
177
- clock_t t1,t2;
178
- mode = 1;
179
- while(1){
180
- input();
181
- if(mode == 1){
182
- t1 = clock();
183
- code_search();
184
- t2 = clock();
185
- printf("\n### %f sec for search. ###\n", diff_time(t1,t2));
186
- }
187
- else if(mode == 2){
188
- t1 = clock();
189
- address_search();
190
- t2 = clock();
191
- printf("\n### %f sec for search. ###\n", diff_time(t1,t2));
192
- if(!ADVANCED) continue;
193
- while(1){
194
- re_input();
195
- if(refine_flag == 0) break;
196
- t1 = clock();
197
- refinement();
198
- t2 = clock();
199
- printf("\n### %f sec for search. ###\n", diff_time(t1,t2));
200
- }
201
- }
202
- else break;
203
- }
204
- }
205
-
206
-
207
- int main()
208
- {
209
- init();
210
- respond();
211
- return 0;
212
- }
213
-
214
- ```
11
+ ```__**
215
-
216
- ### 試したこと
217
-
218
- オーバーフローしていないか確認した。
219
-
220
- ### 補足情報(FW/ツールのバージョンなど)
221
-
222
- ここにより詳細な情報を記載してください。