所以我最近完成了 C++ 的初学者类(class),并想制作我自己的“聊天机器人”,因为显然它很简单并且已经完成了一百万次。我遇到的问题是,当用户输入与我的“if”语句中的多种可能性匹配时,它会不止一次发出命令。
class response{
public:
void answer() {
string x;
cin >> x;
if (x=="Hello"||x=="hello"||x=="Hi"||x=="hi"||x=="hey"||x=="Hey") {
cout << endl << "Hello!" << endl << endl;
}
else {
cout << endl << "I didn't understand that." << endl << endl;
}
} };
例如,如果您输入:“嘿嘿”,您将得到:“你好!你好!”
或者,如果您输入“嘿鱿鱼”,您会得到“你好!我不太明白。”
等等等等。我想知道是否有任何方法可以做到这一点,除非您的整个字符串与确切的 x== 值匹配,否则它将执行 else 语句,并且只执行一次。
编辑:解决方案有效。感谢您的帮助!你们中的一些人问我如何在 main 中使用 class 语句。我希望这有助于阐明我是如何使用它的:
int main()
{
cout << "Hello! I am Drew Bot 1.0." << endl << endl;
for(;;){
response test;
test.answer();
}
}
最佳答案
对于您所描述的情况(这很有意义,因为您正在编写聊天机器人),必须在循环中调用 response::answer()
。
std:cin
的标记由空格字符分隔,因此当您将其流式传输到变量中时,您只会得到第一个单词,其余的单词保留在std::cin
流中。吸引您的部分是如果 std::cin
已经有一个 token ,它不会等待用户输入。
因此,如果您在第一次调用 response::answer
时键入“hey hi hello squid”,它只会检查第一个词。随后的调用将在不提示用户的情况下检查剩余的单词,直到输入流中没有任何内容为止。
一个解决方案是使用 getline (std::cin, x);
代替 std::cin >> x
。
getline
将读取到下一个换行符或 EOF,但您也可以指定自己的分隔符:getline(std::cin, x, ' ');
关于c++ - 如何在接收到满足语句的多个输入时防止执行 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41543348/