質問編集履歴

1

ソースコードの修正

2021/01/17 02:41

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -7,349 +7,3 @@
7
7
  文章によって正しく出力できたり、セグメンテーションフォルトになったり安定しません。
8
8
 
9
9
  改善方法を教えてください。
10
-
11
-
12
-
13
- ```c
14
-
15
- #include <stdio.h>
16
-
17
- #include <stdlib.h>
18
-
19
- #include <ctype.h>
20
-
21
- #include <string.h>
22
-
23
-
24
-
25
- typedef struct text {
26
-
27
- char word[32];
28
-
29
- int NumberOfTimes;
30
-
31
- struct text *next;
32
-
33
- } TEXT;
34
-
35
-
36
-
37
- // 関数のプロトタイプ宣言
38
-
39
- TEXT *makeNewNode(); // 新しいノードを作成する関数
40
-
41
- void insertNodeToList(TEXT *ptr_p, char newWord[]); // リストにノードを挿入する関数
42
-
43
- void addNodeToList(char newWord[]); // リストの最後にノードをつける関数
44
-
45
- void showList(); // 出力をする関数
46
-
47
-
48
-
49
- TEXT *head = NULL; // 先頭ノードのアドレス
50
-
51
- TEXT *tail = NULL; // 末尾ノードのアドレス
52
-
53
- int all_count = 0; // 自作関数でも用いるためグローバル変数
54
-
55
-
56
-
57
- int main(void)
58
-
59
- {
60
-
61
- int target_count = 0; // 指定単語の出現回数
62
-
63
- int i = 0, j = 0; // カウンタ
64
-
65
- FILE *fp;
66
-
67
- char buf[4096];
68
-
69
- char target_word[32];
70
-
71
- TEXT *ptr; // *ptrは(先頭から順に)リストの要素を指す
72
-
73
- TEXT *newNode, *tmp;
74
-
75
- int strCmp;
76
-
77
-
78
-
79
- // データの読み込み
80
-
81
- fp = fopen("text.txt","r");
82
-
83
- if(fp == NULL){
84
-
85
- printf("cannot open file\n");
86
-
87
- exit(1);
88
-
89
- }
90
-
91
-
92
-
93
- // データから1行切り出し
94
-
95
- while(fgets(buf, sizeof(buf), fp) != NULL){
96
-
97
- // 1行から単語切り出し
98
-
99
- while(buf[i] != '\0'){
100
-
101
- // 空白ではないとき
102
-
103
- if(isalnum(buf[i]) != 0){
104
-
105
- target_word[j] = buf[i];
106
-
107
- i++;
108
-
109
- j++;
110
-
111
- }
112
-
113
- // 空白のとき
114
-
115
- else{
116
-
117
- target_word[j] = '\0';
118
-
119
- if(strlen(target_word) > 0){
120
-
121
- all_count++;
122
-
123
- // この時点で単語の切り出しが完了している
124
-
125
- ptr = head;
126
-
127
- while(ptr != NULL){
128
-
129
- strCmp = stricmp(ptr->word, target_word);
130
-
131
- tmp = ptr;
132
-
133
- if(strCmp == 0){
134
-
135
- ptr->NumberOfTimes++;
136
-
137
- break;
138
-
139
- }else if(strCmp < 0){
140
-
141
- tmp = ptr;
142
-
143
- ptr = ptr->next;
144
-
145
- }else{
146
-
147
- if(head == tail){
148
-
149
- newNode = makeNewNode();
150
-
151
- strcpy(newNode->word, target_word);
152
-
153
- newNode->NumberOfTimes = 1;
154
-
155
- newNode->next = head;
156
-
157
- head = newNode;
158
-
159
- ptr = newNode;
160
-
161
- }else{
162
-
163
- insertNodeToList(tmp, target_word);
164
-
165
- }
166
-
167
- break;
168
-
169
- }
170
-
171
- }
172
-
173
- if(ptr == NULL){
174
-
175
- addNodeToList(target_word);
176
-
177
- }
178
-
179
- }
180
-
181
- i++;
182
-
183
- j = 0;
184
-
185
- // target_wordの初期化
186
-
187
- target_word[0] = '\0';
188
-
189
- }
190
-
191
- }
192
-
193
- i = 0; j = 0;
194
-
195
- }
196
-
197
- fclose(fp);
198
-
199
-
200
-
201
- // 出力
202
-
203
- showList();
204
-
205
- printf("\nThe total number of words : %d\n", all_count);
206
-
207
-
208
-
209
- // メモリ領域の解放
210
-
211
- free(ptr);
212
-
213
-
214
-
215
- return 0;
216
-
217
- }
218
-
219
-
220
-
221
- // ノードを生成し、そのアドレスを返す関数
222
-
223
- TEXT *makeNewNode(){
224
-
225
- TEXT *newNode;
226
-
227
- newNode = (TEXT *)malloc(sizeof(TEXT));
228
-
229
- if(newNode == NULL){
230
-
231
- printf("error: cannot make new node\n");
232
-
233
- exit(1);
234
-
235
- }
236
-
237
- newNode -> next = NULL;
238
-
239
-
240
-
241
- return newNode;
242
-
243
- }
244
-
245
-
246
-
247
- void insertNodeToList(TEXT *ptr_p, char newWord[]){
248
-
249
- TEXT *newNode, *tmp;
250
-
251
- if(ptr_p == NULL) return;
252
-
253
-
254
-
255
- // リストのつなぎ替え
256
-
257
- if(ptr_p->next == NULL){
258
-
259
- addNodeToList(newWord);
260
-
261
- }else{
262
-
263
- newNode = makeNewNode();
264
-
265
- strcpy(newNode->word, newWord);
266
-
267
- newNode->NumberOfTimes = 1;
268
-
269
- tmp = ptr_p->next;
270
-
271
- ptr_p->next = newNode;
272
-
273
- newNode->next = tmp;
274
-
275
- }
276
-
277
- }
278
-
279
-
280
-
281
- void addNodeToList(char newWord[]){
282
-
283
- TEXT *newNode;
284
-
285
- newNode = makeNewNode();
286
-
287
- strcpy(newNode->word, newWord);
288
-
289
- newNode->NumberOfTimes = 1;
290
-
291
-
292
-
293
- // リストが空のとき
294
-
295
- if((head == NULL) && (tail == NULL)){
296
-
297
- head = newNode;
298
-
299
- tail = newNode;
300
-
301
- }
302
-
303
- // リストに1つ以上あるとき
304
-
305
- else{
306
-
307
- tail->next = newNode;
308
-
309
- tail = newNode;
310
-
311
- tail->next = NULL;
312
-
313
- }
314
-
315
- }
316
-
317
-
318
-
319
- void showList(){
320
-
321
- TEXT *current;
322
-
323
- if((head == NULL) && (tail == NULL)){
324
-
325
- printf("list is empty\n");
326
-
327
- exit(1);
328
-
329
- }
330
-
331
- // else
332
-
333
- current = head;
334
-
335
- printf(" ### Result ### \n");
336
-
337
- printf("word : times\n");
338
-
339
- while(1){
340
-
341
- printf("%s :", current->word);
342
-
343
- printf(" %d \n", current->NumberOfTimes);
344
-
345
- if(current->next != NULL){
346
-
347
- current = current->next;
348
-
349
- } else break;
350
-
351
- }
352
-
353
- }
354
-
355
- ```