c++ - 如何在接收到满足语句的多个输入时防止执行 if 语句

标签 c++

所以我最近完成了 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/

相关文章:

c++ - 目标需要语言方言 "CXX17"(带有编译器扩展),但 CMake 不知道用于启用它的编译标志

c++ - 优化 bitset 操作

c++ - 我可以根据其 operator() 的签名专门化可变参数模板参数吗

c++ - MFC 日期时间选取器零值

c++ - reinterpret_cast 到 QObject 的同级

c++ - 如何用 C++ 编写类库,就像我们为函数编写的类库一样

c++ - QToolButton 的位置在调整大小或移动父部件时不会改变

c++ - WebRTC:导入错误:没有名为 gyp_chromium 的模块

java - Gradle:扩展现有类型的DLS

c++ - Charuco Marker 和 Diamond Marker 之间的确切区别是什么?