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

回答編集履歴

3

解決コードの提示を依頼

2020/07/04 15:09

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -192,4 +192,20 @@
192
192
  }
193
193
  return 0;
194
194
  }
195
+ ```
196
+ **追記2**
197
+ 解決済みになってしまいましたが、どのようにして解決したのですか?
198
+
199
+ 「覚えて」のあと、記憶させる文字列を複数入力し、「映画」で検索するコードが
200
+ 書けたのなら、それを提示してください。
201
+
202
+ 私の回答のコメント欄に、
203
+ 「これから読ませていただくので疑問はその後に答えさせて頂けないでしょうか。」
204
+ と書いたことを実行してください。
205
+
206
+ おまけのコードで、「入力: 」よりも現在のモードを表示したほうがよいので
207
+ 次のように変更してください。
208
+ ```diff
209
+ - printf("入力: ");
210
+ + printf(mode == MEMORY ? "記憶: " : "検索: ");
195
211
  ```

2

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

2020/07/04 15:09

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -86,4 +86,110 @@
86
86
  DxLib_End();
87
87
  return 0;
88
88
  }
89
+ ```
90
+ **追記**
91
+ `memo[0] = "";` や `or` でエラーにならなかったのは、
92
+ 私のコンパイラが Visual C++ 2017 のものであったからだと思われます。
93
+
94
+ `memo[0] = (char *)"";` に変更したのはエラーメッセージに
95
+ 「error C2440: '=': 'const char [1]' から 'char *' に変換できません。」
96
+ とあったからです。キャスト (char *) により強制的に変換させました。
97
+
98
+ 他にコードについての疑問点はありませんか?
99
+ 完全に理解されましたか?
100
+
101
+ おまけ
102
+ ```C++
103
+ #pragma warning(disable: 4996)
104
+ #include <stdio.h> // fopen, fgets, fclose, printf, puts
105
+ #include <string.h> // strdup, strstr, strchr, strcmp, strlen
106
+
107
+ #define MEMO_FILE "memo2.txt"
108
+
109
+ enum { SEARCH, MEMORY }; // 検索モード、記憶モード
110
+
111
+ int getline(char *buf, int size, FILE *fp)
112
+ {
113
+ if (!fgets(buf, size, fp)) return EOF;
114
+ char *p = strchr(buf, '\n');
115
+ if (p) *p = '\0';
116
+ return strlen(buf);
117
+ }
118
+
119
+ int readMemo(char **memo, int size)
120
+ {
121
+ FILE *fp = fopen(MEMO_FILE, "r");
122
+ if (fp == NULL) return 0;
123
+ int i;
124
+ char buf[256];
125
+ memo[0] = (char *)"";
126
+ for (i = 1; i < size && getline(buf, sizeof buf, fp) >= 0; i++)
127
+ memo[i] = strdup(buf);
128
+ fclose(fp);
129
+ return i;
130
+ }
131
+
132
+ int saveMemo(char **memo, int n)
133
+ {
134
+ FILE *fp = fopen(MEMO_FILE, "w");
135
+ if (fp == NULL) return 1;
136
+ for (int i = 1; i < n; i++)
137
+ fprintf(fp, "%s\n", memo[i]);
138
+ fclose(fp);
139
+ return 0;
140
+ }
141
+
142
+ void drawMemo(char **memo, int n)
143
+ {
144
+ for (int i = 1; i < n; i++)
145
+ printf("%2d: %s\n", i, memo[i]);
146
+ }
147
+
148
+ int addMemo(char **memo, int size, int n, const char *str)
149
+ {
150
+ if (n >= size) return 1;
151
+ memo[n++] = strdup(str);
152
+ return 0;
153
+ }
154
+
155
+ int findMemo(char **memo, int n, char *str)
156
+ {
157
+ for (int i = 0; i < n; i++)
158
+ if (strstr(memo[i], str)) return i;
159
+ return 0;
160
+ }
161
+
162
+ int main()
163
+ {
164
+ char *memo[100];
165
+ memo[0] = (char *)"";
166
+ int n_memo = 1;
167
+ int mode = SEARCH;
168
+
169
+ puts("コマンド: 記憶、検索、表示、保存、取得、終了");
170
+
171
+ while (1) {
172
+ char buf[256];
173
+ printf("入力: ");
174
+ if (getline(buf, sizeof buf, stdin) < 0) break;
175
+ if (buf[0] == '\0') continue;
176
+
177
+ if (!strcmp(buf, "終了")) break;
178
+ else if (!strcmp(buf, "記憶")) mode = MEMORY;
179
+ else if (!strcmp(buf, "検索")) mode = SEARCH;
180
+ else if (!strcmp(buf, "表示")) drawMemo(memo, n_memo);
181
+ else if (!strcmp(buf, "保存")) saveMemo(memo, n_memo);
182
+ else if (!strcmp(buf, "取得")) n_memo = readMemo(memo, 100);
183
+ else if (mode == MEMORY) {
184
+ if (addMemo(memo, 100, n_memo, buf)) puts(" 追加できません");
185
+ else n_memo++;
186
+ }
187
+ else { // mode == SEARCH
188
+ int n_find = findMemo(memo, n_memo, buf);
189
+ if (n_find > 0) printf(" 検索結果: %s\n", memo[n_find]);
190
+ else printf(" 「%s」は見つかりません\n", buf);
191
+ }
192
+ }
193
+ return 0;
194
+ }
89
195
  ```

1

findMemo の return値を修正

2020/07/04 12:42

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -38,7 +38,7 @@
38
38
  if (str[0] != '\0')
39
39
  for (int i = 0; i < n; i++)
40
40
  if (strstr(memo[i], str)) return i;
41
- return -1;
41
+ return 0;
42
42
  }
43
43
 
44
44
  int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
@@ -47,7 +47,7 @@
47
47
  ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用
48
48
  if (DxLib_Init() == -1) return -1; // DXライブラリの初期化
49
49
  SetDrawScreen(DX_SCREEN_BACK); // 描画先を裏画面にする
50
- SetFontSize(24); // フォンサイズを 24に変更
50
+ SetFontSize(24); // フォンサイズを 24に変更
51
51
 
52
52
  char *memo[10];
53
53
  int n_memo = readMemo(memo, 10);
@@ -71,7 +71,7 @@
71
71
  DrawKeyInputString(80, 30, kih); // 入力途中の文字列を描画
72
72
 
73
73
  if (CheckKeyInput(kih) != 0) { // 入力完了なら
74
- GetKeyInputString(buf, kih); // 入力文字を取得
74
+ GetKeyInputString(buf, kih); // 入力文字を取得
75
75
  n_show = findMemo(memo, n_memo, buf); // メモを検索
76
76
  SetActiveKeyInput(kih);
77
77
  SetKeyInputString("", kih);