Я все еще довольно новичок в C++ и программировании, поэтому, возможно, я просто упускаю здесь что-то важное.
Я пытаюсь создать чат-бот для библиотеки, занимаюсь временем работы и т. д. И другими вещами. Я хочу, чтобы чат-бот мог подобрать ключевые слова при вводе, а затем вызвать правильную функцию, которая сможет вернуть им некоторый текст.
Например:
пользователь: до какого часа библиотека открыта? //чат-бот улавливает ключевое слово «открыть» и возвращает правильную функцию чат-бот: библиотеки открываются с 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
Спасибо за вашу помощь!





Проблема с
std::find(keywords.begin(), keywords.end(), KQuery)
собирается ли он увидеть, соответствует ли вся строка в KQuery одному из ваших ключевых слов. Поскольку в KQuery есть предложение, оно не найдет соответствия. Что вам нужно сделать, так это перебрать все ключевые слова и посмотреть, возвращает ли KQuery.find(keyword) допустимый результат.
Вы можете сделать это, используя std::find_if и лямбду, например
std::find_if (keywords.begin(), keywords.end(),
[&](auto const& keyword){ return KQuery.find(keyword) != std::string::npos; });
Это вернет итератор к первому ключевому слову, которое он найдет в KQuery или keywords.end(), если ни одно из ключевых слов не найдено.
Не весь ваш код:
..\main.cpp:5:10: fatal error: FinalProject.hpp: No such file or directory. На самом деле, мы бы предпочли минимальный воспроизводимый пример, чем весь ваш код.