我正在制作一个非常简单的程序,只是一个小小的聊天机器人类的东西,我当然有一些代码,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
的某些内容?我真的很困惑,并希望得到一些关于如何改进这个程序的建议,以便它真正起作用。
答案 0 :(得分:2)
sizeof(dictionary)
会提供sizeof(keyword*)
,可能是4
或8
,因此您将遍历字典数组的末尾并终止。
最简单的修复:定义一个常量来存储数组长度。
const dictionarySize = 2;
并在整个过程中使用它。
您还需要将struct keyword
更改为:
struct keyword{
string keywords;
string responses[3];
};
答案 1 :(得分: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
还有其他方法,但这样更安全,无需内存管理......