回答編集履歴
3
解決コードの提示を依頼
    
        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
コンパイルエラーについて原因を追加
    
        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値を修正
    
        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  
     | 
| 
      
 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);                    // フォン 
     | 
| 
      
 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);
         
     |