0

私は非常に単純なプログラムを作成しています。ちょっとしたチャット ボット AI のようなもので、プログラム用のコード、もちろん c++ があります。エラーは発生しませんが、実行すると、応答を停止したように、program.exe が動作を停止したことを示すウィンドウが表示されます。私のコードは次のとおりです。

#include<iostream>
#include<string.h>
#include<cmath>
#include<vector>
#include<ctime>
#include<conio.h>
#include<algorithm>
#include<cstdlib>
using namespace std;

struct strarray{
   char* array[];
};

struct keyword{
   string keywords;
   string responses[];       
};


keyword * dictionary = new keyword[2];
keyword defaultr;

keyword getMatch(string key);
string sconvert(string con);
void init();
string getResp(keyword key);

bool cont=true;

int main(int argc, char* argv[]){
   string input;
   while(cont){
            getline(cin,input);
            cout << getResp(getMatch(input));
            getch();
            getch();
   }
}

string sconvert(string con){
   con.erase(remove_if(con.begin(), con.end(), ::isspace), con.end());
   con.erase(remove_if(con.begin(), con.end(), ::ispunct), con.end());
   return con;
}

void init(){
   srand(time(NULL));
   dictionary[0].keywords="hello";
   dictionary[0].responses[0]="Hello, how have you been?";
   dictionary[0].responses[1]="Hello, have you missed me?";
   dictionary[0].responses[2]="Hey, how's it going?";
   defaultr.responses[0]="That's interesting, tell me more.";
   defaultr.responses[1]="Please, tell me more.";
}

keyword getMatch(string key){
    for(int i=0; i<sizeof(dictionary); i++){
            if(key==dictionary[i].keywords){return dictionary[i];}
    }
    return defaultr;
}

string getResp(keyword key){
   return key.responses[rand() % sizeof(key)];
}

実行すると正常に開きますが、起動時に何かを入力すると「動作が停止」します。何を変更する必要があるのか​​、なぜありがたいのか教えてください。

ポインターに問題がありますか?または何かrand?私は本当に混乱しており、実際に機能するようにこのプログラムを改善する方法についてアドバイスをいただければ幸いです。

4

2 に答える 2

2

sizeof(dictionary)sizeof(keyword*)、おそらく4またはを与える8ので、辞書配列の最後を反復処理して終了します。

最も簡単な修正: 配列の長さを格納する定数を定義します。

const dictionarySize = 2;

それを全体で使用します。

また、次のように変更struct keywordする必要があります。

struct keyword{
   string keywords;
   string responses[3];       
};
于 2012-12-13T22:44:06.740 に答える
1

まず第一に、あなたは無限ループを持っているので、プログラムは永遠に動作するはずです..コードを見て、rand() % sizeof(key) を使用するのは間違っています。応答は事前に決定されていないため、特定の値に設定しますたとえば値

struct keyword {
    string keywords;
    string responses[2];       
};
rand() % sizeof(key.responses)

または、このような構造を作成します

struct keyword {
    string keywords;
    vector<string> responses;      
};
rand() % key.responses.size()
//After setting the responses by push_back for example

他の方法もありますが、これはより安全であり、メモリ管理は必要ありません...

于 2012-12-13T22:37:12.513 に答える