回答編集履歴

3

解決コードの提示を依頼

2020/07/04 15:09

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -387,3 +387,35 @@
387
387
  }
388
388
 
389
389
  ```
390
+
391
+ **追記2**
392
+
393
+ 解決済みになってしまいましたが、どのようにして解決したのですか?
394
+
395
+
396
+
397
+ 「覚えて」のあと、記憶させる文字列を複数入力し、「映画」で検索するコードが
398
+
399
+ 書けたのなら、それを提示してください。
400
+
401
+
402
+
403
+ 私の回答のコメント欄に、
404
+
405
+ 「これから読ませていただくので疑問はその後に答えさせて頂けないでしょうか。」
406
+
407
+ と書いたことを実行してください。
408
+
409
+
410
+
411
+ おまけのコードで、「入力: 」よりも現在のモードを表示したほうがよいので
412
+
413
+ 次のように変更してください。
414
+
415
+ ```diff
416
+
417
+ - printf("入力: ");
418
+
419
+ + printf(mode == MEMORY ? "記憶: " : "検索: ");
420
+
421
+ ```

2

コンパイルエラーについて原因を追加

2020/07/04 15:09

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -175,3 +175,215 @@
175
175
  }
176
176
 
177
177
  ```
178
+
179
+ **追記**
180
+
181
+ `memo[0] = "";` や `or` でエラーにならなかったのは、
182
+
183
+ 私のコンパイラが Visual C++ 2017 のものであったからだと思われます。
184
+
185
+
186
+
187
+ `memo[0] = (char *)"";` に変更したのはエラーメッセージに
188
+
189
+ 「error C2440: '=': 'const char [1]' から 'char *' に変換できません。」
190
+
191
+ とあったからです。キャスト (char *) により強制的に変換させました。
192
+
193
+
194
+
195
+ 他にコードについての疑問点はありませんか?
196
+
197
+ 完全に理解されましたか?
198
+
199
+
200
+
201
+ おまけ
202
+
203
+ ```C++
204
+
205
+ #pragma warning(disable: 4996)
206
+
207
+ #include <stdio.h> // fopen, fgets, fclose, printf, puts
208
+
209
+ #include <string.h> // strdup, strstr, strchr, strcmp, strlen
210
+
211
+
212
+
213
+ #define MEMO_FILE "memo2.txt"
214
+
215
+
216
+
217
+ enum { SEARCH, MEMORY }; // 検索モード、記憶モード
218
+
219
+
220
+
221
+ int getline(char *buf, int size, FILE *fp)
222
+
223
+ {
224
+
225
+ if (!fgets(buf, size, fp)) return EOF;
226
+
227
+ char *p = strchr(buf, '\n');
228
+
229
+ if (p) *p = '\0';
230
+
231
+ return strlen(buf);
232
+
233
+ }
234
+
235
+
236
+
237
+ int readMemo(char **memo, int size)
238
+
239
+ {
240
+
241
+ FILE *fp = fopen(MEMO_FILE, "r");
242
+
243
+ if (fp == NULL) return 0;
244
+
245
+ int i;
246
+
247
+ char buf[256];
248
+
249
+ memo[0] = (char *)"";
250
+
251
+ for (i = 1; i < size && getline(buf, sizeof buf, fp) >= 0; i++)
252
+
253
+ memo[i] = strdup(buf);
254
+
255
+ fclose(fp);
256
+
257
+ return i;
258
+
259
+ }
260
+
261
+
262
+
263
+ int saveMemo(char **memo, int n)
264
+
265
+ {
266
+
267
+ FILE *fp = fopen(MEMO_FILE, "w");
268
+
269
+ if (fp == NULL) return 1;
270
+
271
+ for (int i = 1; i < n; i++)
272
+
273
+ fprintf(fp, "%s\n", memo[i]);
274
+
275
+ fclose(fp);
276
+
277
+ return 0;
278
+
279
+ }
280
+
281
+
282
+
283
+ void drawMemo(char **memo, int n)
284
+
285
+ {
286
+
287
+ for (int i = 1; i < n; i++)
288
+
289
+ printf("%2d: %s\n", i, memo[i]);
290
+
291
+ }
292
+
293
+
294
+
295
+ int addMemo(char **memo, int size, int n, const char *str)
296
+
297
+ {
298
+
299
+ if (n >= size) return 1;
300
+
301
+ memo[n++] = strdup(str);
302
+
303
+ return 0;
304
+
305
+ }
306
+
307
+
308
+
309
+ int findMemo(char **memo, int n, char *str)
310
+
311
+ {
312
+
313
+ for (int i = 0; i < n; i++)
314
+
315
+ if (strstr(memo[i], str)) return i;
316
+
317
+ return 0;
318
+
319
+ }
320
+
321
+
322
+
323
+ int main()
324
+
325
+ {
326
+
327
+ char *memo[100];
328
+
329
+ memo[0] = (char *)"";
330
+
331
+ int n_memo = 1;
332
+
333
+ int mode = SEARCH;
334
+
335
+
336
+
337
+ puts("コマンド: 記憶、検索、表示、保存、取得、終了");
338
+
339
+
340
+
341
+ while (1) {
342
+
343
+ char buf[256];
344
+
345
+ printf("入力: ");
346
+
347
+ if (getline(buf, sizeof buf, stdin) < 0) break;
348
+
349
+ if (buf[0] == '\0') continue;
350
+
351
+
352
+
353
+ if (!strcmp(buf, "終了")) break;
354
+
355
+ else if (!strcmp(buf, "記憶")) mode = MEMORY;
356
+
357
+ else if (!strcmp(buf, "検索")) mode = SEARCH;
358
+
359
+ else if (!strcmp(buf, "表示")) drawMemo(memo, n_memo);
360
+
361
+ else if (!strcmp(buf, "保存")) saveMemo(memo, n_memo);
362
+
363
+ else if (!strcmp(buf, "取得")) n_memo = readMemo(memo, 100);
364
+
365
+ else if (mode == MEMORY) {
366
+
367
+ if (addMemo(memo, 100, n_memo, buf)) puts(" 追加できません");
368
+
369
+ else n_memo++;
370
+
371
+ }
372
+
373
+ else { // mode == SEARCH
374
+
375
+ int n_find = findMemo(memo, n_memo, buf);
376
+
377
+ if (n_find > 0) printf(" 検索結果: %s\n", memo[n_find]);
378
+
379
+ else printf(" 「%s」は見つかりません\n", buf);
380
+
381
+ }
382
+
383
+ }
384
+
385
+ return 0;
386
+
387
+ }
388
+
389
+ ```

1

findMemo の return値を修正

2020/07/04 12:42

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
  if (strstr(memo[i], str)) return i;
80
80
 
81
- return -1;
81
+ return 0;
82
82
 
83
83
  }
84
84
 
@@ -96,7 +96,7 @@
96
96
 
97
97
  SetDrawScreen(DX_SCREEN_BACK); // 描画先を裏画面にする
98
98
 
99
- SetFontSize(24); // フォンサイズを 24に変更
99
+ SetFontSize(24); // フォンサイズを 24に変更
100
100
 
101
101
 
102
102
 
@@ -144,7 +144,7 @@
144
144
 
145
145
  if (CheckKeyInput(kih) != 0) { // 入力完了なら
146
146
 
147
- GetKeyInputString(buf, kih); // 入力文字を取得
147
+ GetKeyInputString(buf, kih); // 入力文字を取得
148
148
 
149
149
  n_show = findMemo(memo, n_memo, buf); // メモを検索
150
150