我对C ++和编程还是很陌生,所以我可能在这里错过了很多重要的东西。
我正在尝试为图书馆创建聊天机器人,处理开放时间等问题。我希望聊天机器人能够在输入中提取关键字,然后能够调用正确的函数,以便向他们返回一些文本。
例如:
用户:图书馆什么时候开放? // chatbot选出关键字“ open”并返回正确的函数 chatbot:库在6到5之间打开
它不应该像我发现它那样使聊天机器人能够做到这一点那么难。
我遇到问题的功能:
std::string GetKeywords(){
std::string KQuery = GetQuery();
std::vector<std::string> keywords{"open", "opening", "times", "close", "closing", "shut"};
if(std::find(keywords.begin(), keywords.end(), KQuery) != keywords.end()){
std::cout << "Library is open when I say it is" << std::endl;
}
return 0;
};
这将返回内存错误,并且是我的代码中唯一引发问题的位置。
我所有的代码:
#include <iostream>
#include <string>
#include <vector>
#include "FinalProject.hpp"
//introducing funtions
void PrintIntro();
std::string GetQuery();
std::string RunScripts();
std::string GetKeywords();;
// introducing chatbot
RunScript ChatBot;
int main(){
PrintIntro();
GetQuery();
GetKeywords();
};
void PrintIntro(){
//printing introductory text to ask the user for input
std::cout << "Hi, I'm Librarius, I'm here to help you with University library queries" << std::endl;
std::cout << "I can help you with the following: \n Spaces to study \n Opening times \n Taking out books \n Returning books\n" << std:: endl;
std::cout << "Ask away!" << std::endl;
return;
};
std::string GetQuery(){
//getting input from the user
std::string Query = "";
std::getline(std::cin, Query);
if(Query.empty()){
//checking to see if the user hasnt entered anything
std::cout << "Hey! Why didnt you enter anything?! I don't want to waste my time!" << std::endl;
};
return Query;
};
std::string GetKeywords(){
std::string KQuery = GetQuery();
std::vector<std::string> keywords{"open", "opening", "times", "close", "closing", "shut"};
if(std::find(keywords.begin(), keywords.end(), KQuery) != keywords.end()){
std::cout << "Library is open when I say it is" << std::endl;
}
return 0;
};
//using the input got from the user to decide which script to run
//TODO analyse the users keywords and decide on a script to run
//TODO return an appropriate script
感谢您的帮助!
答案 0 :(得分:2)
问题
std::find(keywords.begin(), keywords.end(), KQuery)
是否要查看KQuery
中的整个字符串是否与您的关键字之一匹配。由于KQuery
中有一个句子,因此不会找到匹配项。您需要做的是遍历所有关键字,看看KQuery.find(keyword)
是否返回有效结果。
您可以使用std::find_if
和lambda之类的
std::find_if(keywords.begin(), keywords.end(),
[&](auto const& keyword){ return KQuery.find(keyword) != std::string::npos; });
如果未找到任何关键字,这将使迭代器返回它在KQuery
或keywords.end()
中找到的第一个关键字。