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

質問編集履歴

1

ソースコードの修正

2021/01/17 02:41

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -2,177 +2,4 @@
2
2
  以下のプログラムを作成したのですが、想定する挙動の動きができません。
3
3
  デバッガを使ってもどこが誤りかいまいちわかりません。
4
4
  文章によって正しく出力できたり、セグメンテーションフォルトになったり安定しません。
5
- 改善方法を教えてください。
5
+ 改善方法を教えてください。
6
-
7
- ```c
8
- #include <stdio.h>
9
- #include <stdlib.h>
10
- #include <ctype.h>
11
- #include <string.h>
12
-
13
- typedef struct text {
14
- char word[32];
15
- int NumberOfTimes;
16
- struct text *next;
17
- } TEXT;
18
-
19
- // 関数のプロトタイプ宣言
20
- TEXT *makeNewNode(); // 新しいノードを作成する関数
21
- void insertNodeToList(TEXT *ptr_p, char newWord[]); // リストにノードを挿入する関数
22
- void addNodeToList(char newWord[]); // リストの最後にノードをつける関数
23
- void showList(); // 出力をする関数
24
-
25
- TEXT *head = NULL; // 先頭ノードのアドレス
26
- TEXT *tail = NULL; // 末尾ノードのアドレス
27
- int all_count = 0; // 自作関数でも用いるためグローバル変数
28
-
29
- int main(void)
30
- {
31
- int target_count = 0; // 指定単語の出現回数
32
- int i = 0, j = 0; // カウンタ
33
- FILE *fp;
34
- char buf[4096];
35
- char target_word[32];
36
- TEXT *ptr; // *ptrは(先頭から順に)リストの要素を指す
37
- TEXT *newNode, *tmp;
38
- int strCmp;
39
-
40
- // データの読み込み
41
- fp = fopen("text.txt","r");
42
- if(fp == NULL){
43
- printf("cannot open file\n");
44
- exit(1);
45
- }
46
-
47
- // データから1行切り出し
48
- while(fgets(buf, sizeof(buf), fp) != NULL){
49
- // 1行から単語切り出し
50
- while(buf[i] != '\0'){
51
- // 空白ではないとき
52
- if(isalnum(buf[i]) != 0){
53
- target_word[j] = buf[i];
54
- i++;
55
- j++;
56
- }
57
- // 空白のとき
58
- else{
59
- target_word[j] = '\0';
60
- if(strlen(target_word) > 0){
61
- all_count++;
62
- // この時点で単語の切り出しが完了している
63
- ptr = head;
64
- while(ptr != NULL){
65
- strCmp = stricmp(ptr->word, target_word);
66
- tmp = ptr;
67
- if(strCmp == 0){
68
- ptr->NumberOfTimes++;
69
- break;
70
- }else if(strCmp < 0){
71
- tmp = ptr;
72
- ptr = ptr->next;
73
- }else{
74
- if(head == tail){
75
- newNode = makeNewNode();
76
- strcpy(newNode->word, target_word);
77
- newNode->NumberOfTimes = 1;
78
- newNode->next = head;
79
- head = newNode;
80
- ptr = newNode;
81
- }else{
82
- insertNodeToList(tmp, target_word);
83
- }
84
- break;
85
- }
86
- }
87
- if(ptr == NULL){
88
- addNodeToList(target_word);
89
- }
90
- }
91
- i++;
92
- j = 0;
93
- // target_wordの初期化
94
- target_word[0] = '\0';
95
- }
96
- }
97
- i = 0; j = 0;
98
- }
99
- fclose(fp);
100
-
101
- // 出力
102
- showList();
103
- printf("\nThe total number of words : %d\n", all_count);
104
-
105
- // メモリ領域の解放
106
- free(ptr);
107
-
108
- return 0;
109
- }
110
-
111
- // ノードを生成し、そのアドレスを返す関数
112
- TEXT *makeNewNode(){
113
- TEXT *newNode;
114
- newNode = (TEXT *)malloc(sizeof(TEXT));
115
- if(newNode == NULL){
116
- printf("error: cannot make new node\n");
117
- exit(1);
118
- }
119
- newNode -> next = NULL;
120
-
121
- return newNode;
122
- }
123
-
124
- void insertNodeToList(TEXT *ptr_p, char newWord[]){
125
- TEXT *newNode, *tmp;
126
- if(ptr_p == NULL) return;
127
-
128
- // リストのつなぎ替え
129
- if(ptr_p->next == NULL){
130
- addNodeToList(newWord);
131
- }else{
132
- newNode = makeNewNode();
133
- strcpy(newNode->word, newWord);
134
- newNode->NumberOfTimes = 1;
135
- tmp = ptr_p->next;
136
- ptr_p->next = newNode;
137
- newNode->next = tmp;
138
- }
139
- }
140
-
141
- void addNodeToList(char newWord[]){
142
- TEXT *newNode;
143
- newNode = makeNewNode();
144
- strcpy(newNode->word, newWord);
145
- newNode->NumberOfTimes = 1;
146
-
147
- // リストが空のとき
148
- if((head == NULL) && (tail == NULL)){
149
- head = newNode;
150
- tail = newNode;
151
- }
152
- // リストに1つ以上あるとき
153
- else{
154
- tail->next = newNode;
155
- tail = newNode;
156
- tail->next = NULL;
157
- }
158
- }
159
-
160
- void showList(){
161
- TEXT *current;
162
- if((head == NULL) && (tail == NULL)){
163
- printf("list is empty\n");
164
- exit(1);
165
- }
166
- // else
167
- current = head;
168
- printf(" ### Result ### \n");
169
- printf("word : times\n");
170
- while(1){
171
- printf("%s :", current->word);
172
- printf(" %d \n", current->NumberOfTimes);
173
- if(current->next != NULL){
174
- current = current->next;
175
- } else break;
176
- }
177
- }
178
- ```