

**問題点1**  
以下のように「どんな映画が好きなの？」と聞くと本来ならば前もって作っておいたda.xtに保存した「どんな映画が好きかというと特にない」と返事がもらえるのですが  
、文字化けのせいか文字が一致しない場合の「申し訳ありません。○○とはなんですか？」になってしまいます。

[code]

    memoyの値：0bufferの値：bufferの値：なぜ映画が好きなの？
    ﾈぜ映画が好きなの？とは何ですか？
    
[/code]

文字化けを避けるために getline(buffer, inputmozi); //strに文字列を格納 を使いましたがうまくいきません。

**問題点2**  
bufferとbuffer2の中身を表示しようとしたのですが、うまくいかず何も表示されません。

問題点1と問題点2に関して私の方でもできる限りのデバッグをしましたが、解決できませんでした。  
なので解決するまでのデバッグ方法などあれば詳しく教えてください。

環境は Windows10、Visual Studio 2019 です。

* * *

### 現状のソースコード

[code]

    #pragma warning(disable: 4996)
    #include <string>
    #include <Windows.h>
    #include <iostream>
        
    char String[256];
    int InputHandle;
    int InputHandleA;
    int modoru = 0;
    int mozicount = 0;
    int gimonnlock = 0;
    int gimon = 0;
    
    int my_str2(const char* s1, const char* s2)//ここで入力した文字列と用意された文字列を引数として扱う。
    
    {
        //s1, s2を比較する関数を使うためだけにs2の文字列のサイズが必要なので、変数aに用意した文字列の情報s2を文字列の長さを測るための関数strlenに引数として渡す。
        const size_t a = strlen(s2);
        //無限ループする。
        for (;;) {
            //関数memcmpの返り値が0の時は一致した時なので、==0とする。
            if (memcmp(s1, s2, a) == 0)
    
                return 1;//入力した文字列にい指定された文字列が入っていた場合は1を返すように設定した。
    //入力した文字列が最後の文字まで到達した場合は一致する文字列がないということなので0を返すようにした。
            else if (*s1 == '\0')
    
                return 0;//入っていなかった
    //文字列が一致した場合でも一致する文字列がない場合でも入力した文字列の一文字分の文字コードのバイト数？が繰り上がるようにした。
            else
    
                ++s1;
    
        }
    
    }
    
    int memory = 0;
    char buffer[256];//★InputHandleに入ったのは文字のデータなので、文字のデータが受け取れる変数の型にする。
    char buffer2[256];
    char* p;
    FILE* outputfile;         // 出力ストリーム
    int inputmozi = 0;
    int hyouzi = 0;
    unsigned char uchr;
    void getline(char s[], int lim){  
        int c, i;   //getcharの受け取り用変数c、ループ用変数i  
          
        for (i = 0; i < lim - 1 && (c = getchar()) != '\n'; ++i)  
            s[i] = c;  
          
        s[i] = '\0';  
    }  
    void getline(char line[], int maxline);
    
    int main(void)
    {
        printf("memoyの値：%d", memory);
        printf("bufferの値：%s", buffer);
        printf("bufferの値：%s", buffer2);
    
        //新しい言葉の処理
    
            //  キーボード入力待ち
            inputmozi = getchar();
            getline(buffer, inputmozi);  //strに文字列を格納  
            if (my_str2(buffer, "覚えて")) {
                printf("何を覚えますか？");
               ++mozicount;
                memory = 1;
                gimon = 0;
            }
            //覚えてという言葉以外の場合はメモを読み込む込んでループに入るようにした。
            else if (memory == 0) {
                outputfile = fopen("da.txt", "r");  // ファイルを読み込み用にオープン(開く)
                if (outputfile == NULL) {          // オープンに失敗した場合
                    printf("cannot open\n");         // エラーメッセージを出して
                    exit(1);                         // 異常終了
                }
                //fgetsがNULLになるまで繰り返す
         //fgets(str,256,lf)!=NULL
         //と同じです。このように短縮することも可能
                //★bufferには文字入力の文字列を入れたので、ここにはメモからの文字列は入れられない。なので新しくbuffer2を作る。
                while ((fgets(buffer2, 256, outputfile)) != NULL)//メモに書いた文字列をbuffer2の中に入れる。
                {
                    if (my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "どんな") && my_str2(buffer, "？") ||
                        my_str2(buffer, "映画") && my_str2(buffer, "好き") && my_str2(buffer, "？")) {
                        ++mozicount;
                        gimonnlock = 1;
                        if (my_str2(buffer2, "映画") && my_str2(buffer, "どんな")) {
                            hyouzi = 1;
                            break;
                        }
                    }
                   // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致する文字が出てきた場合
                    if (strcmp(buffer, buffer2) == 0) {
                        hyouzi = 1;
                    }
                    // 文字の入力の入るバッファと、メモからの文字が入るバッファ2とで一致しない文字が出てきた場合
                    if (hyouzi == 0) {
                        if (strcmp(buffer, buffer2) == 1) {
                            gimon = 1;
                        }
                    }
                }
    
                fclose(outputfile);          // ファイルをクローズ(閉じる)
    
            }
            if (memory == 1 && my_str2(buffer, "とは") or memory == 1 && my_str2(buffer, "は") or memory == 1 && my_str2(buffer, "が")) {
                ++mozicount;
                memory = 2;
            }
        //エンターキーが押されていないときでの処理
        if (memory == 2) {   
            //例えば、intとして49はそのままの値だが、charとしては49は文字コードで言う1を表す。//このような変換をしたようなもの。
            outputfile = fopen("da.txt", "a+");  // ファイルを書き込み用にオープン(開く)
            if (outputfile == NULL) {          // オープンに失敗した場合
                printf("cannot open\n");         // エラーメッセージを出して
                exit(1);                         // 異常終了
            }
            fprintf(outputfile, "%s\n", buffer); // ファイルに書く
            fclose(outputfile);          // ファイルをクローズ(閉じる)
            //fclose(fp);//ファイルに書き込んだときにウィンドウが消えるようになっているので、memoryが1になった瞬間に書き込んでいるうんぬん以前に
            //ファイルが閉じるのでウィンドウが消えてしまう。
            memory = 0;
            // return 0;//ここで0になると終了してしまうので書き込んだ後も言葉が打ち込めるようにここを消す。
    
        }
    
        if ( hyouzi == 1) {
            printf("%s", buffer2);
    
        }
        if (hyouzi == 0 && gimon == 1) {
            printf("%sとは何ですか？", buffer);
        }
    
        // 終了
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2020-07-01T19:13:59.820
68193
2020-07-02T22:37:03.717
2020-07-02T22:37:03.717
4236
27296
question
c++
da.txtに保存した「どんな映画が好きですか？」と入力すると「どんな映画が好きかというと特にない」と表示したい。

[code]

    inputmozi = getchar();
    getline(buffer, inputmozi);  //strに文字列を格納
    
[/code]

が間違いですね。

`getline` 関数に渡す第2パラメータは 文字列の最大長を指定する目的で 関数を自作していると  
思うので `sizeof(buffer)` を指定すべきでしょう。

また、`inputmozi = getchar();` としているため 先頭の1バイト分 （全角文字の 前半部分）  
が 切り取られて `getline` が呼ばれているので 先頭の全角1文字が 文字化けした状態になっています。

> デバッグ方法

Visual Studio であれば デバッグのステップ実行で [F10] [F11] や 変数の内容を確認しながら  
1行づつステップ実行するのが良いでしょう。

ある程度、予想がつくならブレークポイントを設定して その周辺を重点的にするとよいかと。

[チュートリアル: Visual Studio を使用した C++
のデバッグについて理解する](https://docs.microsoft.com/ja-jp/visualstudio/debugger/getting-
started-with-the-debugger-cpp?view=vs-2019)

が参考になると思います。


CC BY-SA 4.0
2020-07-01T23:25:06.713
68198
2020-07-01T23:25:06.713
18851
68193
answer