質問編集履歴

1

頂いた回答からコードを書き直しました

2020/12/07 08:09

投稿

takumi-33
takumi-33

スコア19

test CHANGED
File without changes
test CHANGED
@@ -12,185 +12,201 @@
12
12
 
13
13
  ### 発生している問題・エラーメッセージ
14
14
 
15
-
15
+ 1つ目は、作成したテーブルをfor文で回して、keyと同じ文字列かどうかをstrcmpで探すという操作を行いたいのですが、
16
+
17
+
18
+
19
+ '関数': 間接参照のレベルが 'const char *' と 'char' で異なっています。
20
+
21
+
22
+
23
+ というエラーが表示されています。
24
+
25
+
26
+
27
+ このエラーを解消するためには、
28
+
29
+ ・keyも次元配列にする
30
+
31
+ ・keyでない配列を1次元配列にする
32
+
33
+ のどちらかが必要だと思います。
34
+
35
+
36
+
37
+ この場合、
38
+
39
+ struct Table{
40
+
41
+ char discovery[];
42
+
43
+ char key[];
44
+
45
+ }
46
+
47
+
48
+
49
+ にすれば良いのかと考えたのですが、これだとテーブルの中にkeyがn個含まれてしまっておかしなことになってしまうと思います。
50
+
51
+
52
+
53
+ また、keyでない配列はテーブルを示すので、1次元配列にすることはできない。
54
+
55
+ このことから、どのように形式をそろえれば良いのかが分かりません。
56
+
57
+
58
+
59
+ ```
60
+
61
+ kadai8_1.c(18): warning C4047: '関数': 間接参照のレベルが 'const char *' と 'char' で異なっています。
62
+
63
+
64
+
65
+ ### 該当のソースコード
66
+
67
+
68
+
69
+ ```C言語
70
+
71
+ #include <stdio.h>
72
+
73
+ #include <string.h>
74
+
75
+
76
+
77
+ /*テーブルの作成*/
78
+
79
+ struct Table{
80
+
81
+ char dictionary[100];
82
+
83
+ };
84
+
85
+
86
+
87
+ struct Table table[2];
88
+
89
+
90
+
91
+ int n=8386;
92
+
93
+ int j=0;
94
+
95
+
96
+
97
+ /*キーワードを探す*/
98
+
99
+ int serch(char key[]){
100
+
101
+ int i;
102
+
103
+ for(i=0;i<n;i++){
104
+
105
+ if(strcmp(table[0].dictionary[i] , key)==0){
106
+
107
+ return (table[0].dictionary[i]);
108
+
109
+ }
110
+
111
+ j++;
112
+
113
+ }
114
+
115
+ return -1;
116
+
117
+ }
118
+
119
+
120
+
121
+
122
+
123
+ int main(void)
124
+
125
+ {
126
+
127
+ FILE *fp;
128
+
129
+ char tmp[100];
130
+
131
+ char yomi[100];
132
+
133
+ char hyouki[100];
134
+
135
+ char hinshi[100];
136
+
137
+ char key[100];
138
+
139
+
140
+
141
+ fp=fopen("dictionary.txt","r");
142
+
143
+
144
+
145
+ if(fp==NULL){
146
+
147
+ puts("ファイルが開けません\n");
148
+
149
+ exit(1);
150
+
151
+ }
152
+
153
+
154
+
155
+ while(fgets(tmp,sizeof(tmp),fp)!=NULL){
156
+
157
+ sscanf(tmp,"%s,%s,%s",yomi,hyouki,hinshi);
158
+
159
+ }
160
+
161
+
162
+
163
+ printf("key");
164
+
165
+ putchar(' ');
166
+
167
+ putchar('=');
168
+
169
+ putchar(' ');
170
+
171
+ scanf("%s",key);
172
+
173
+
174
+
175
+ if(serch(key)==0){
176
+
177
+ printf("[%d] %s %s",serch(key),hyouki,hinshi);
178
+
179
+ }else{
180
+
181
+ printf("存在しない");
182
+
183
+
184
+
185
+ }
186
+
187
+
16
188
 
17
189
  printf("比較回数(線形):");
18
190
 
19
- printf("%d",&j);
20
-
21
-
22
-
23
- のコードを
24
-
25
-
26
-
27
- printf("比較回数(線形):");
28
-
29
191
  printf("%d",j);
30
192
 
31
-
32
-
33
-
34
-
35
- に書きかえるとエラーが表示されなくなりました。int 型のグローバル変数をprintfするときに何故‘&’が必要がないのか分かりません。
193
+
36
-
37
-
38
-
194
+
39
- また、実行してもkeyの場所、表記、品詞、実行回数が表示されなくて困っています。
195
+ fclose(fp);
196
+
197
+ return 0;
198
+
199
+ }
40
200
 
41
201
  ```
42
202
 
43
- kadai8_1.c(61): warning C4477: 'printf' : 書式文字列 '%d' には、型 'int' の引数が必要ですが、可変個引数 1 は型 'int *' です
44
-
45
- ```
46
-
47
-
48
-
49
- ### 該当のソースコード
50
-
51
-
52
-
53
- ```C言語
54
-
55
- #include <stdio.h>
56
-
57
- #include <string.h>
58
-
59
-
60
-
61
- /*テーブルの作成*/
62
-
63
- struct Table{
64
-
65
- char dictionary[100];
66
-
67
- };
68
-
69
-
70
-
71
- struct Table table[2];
72
-
73
-
74
-
75
- int n=8386;
76
-
77
- int j=0;
78
-
79
-
80
-
81
- /*キーワードを探す*/
82
-
83
- int serch(char key[]){
84
-
85
- int i;
86
-
87
- for(i=0;i<n;i++){
88
-
89
- if(strcmp(table[i].dictionary , key)==0){
90
-
91
- return (table[i].dictionary[0]);
92
-
93
- }
94
-
95
- j++;
96
-
97
- }
98
-
99
- return -1;
100
-
101
- }
102
-
103
-
104
-
105
-
106
-
107
- int main(void)
108
-
109
- {
110
-
111
- FILE *fp;
112
-
113
- char tmp[100];
114
-
115
- char yomi[100];
116
-
117
- char hyouki[100];
118
-
119
- char hinshi[100];
120
-
121
- char key[100];
122
-
123
-
124
-
125
- fp=fopen("dictionary.txt","r");
126
-
127
-
128
-
129
- if(fp==NULL){
130
-
131
- puts("ファイルが開けません\n");
132
-
133
- exit(1);
134
-
135
- }
136
-
137
-
138
-
139
- while(fgets(tmp,sizeof(tmp),fp)!=NULL){
140
-
141
- sscanf(tmp,"%s,%s,%s",yomi,hyouki,hinshi);
142
-
143
- }
144
-
145
-
146
-
147
- printf("key");
148
-
149
- putchar(' ');
150
-
151
- putchar('=');
152
-
153
- putchar(' ');
154
-
155
- scanf("%s",key);
156
-
157
-
158
-
159
- if(serch(key)==0){
160
-
161
- printf("[%d] %s %s",serch(key),hyouki,hinshi);
162
-
163
- }else{
164
-
165
- printf("存在しない");
166
-
167
-
168
-
169
- }
170
-
171
-
172
-
173
- printf("比較回数(線形):");
174
-
175
- printf("%d",&j);
176
-
177
-
178
-
179
- fclose(fp);
180
-
181
- return 0;
182
-
183
- }
184
-
185
- ```
186
-
187
203
 
188
204
 
189
205
  ### 試したこと
190
206
 
191
207
 
192
208
 
193
- &の付け外し、コードの読み直し
209
+ コードの読み直し
194
210
 
195
211
 
196
212