c++ - 为什么输入流不识别 Ctrl D 而给出一个无限循环?

标签 c++ c++17

我正在尝试读入用户输入的字符,直到按下 Ctrl+ D。执行我的代码时,循环似乎在“请输入字符串并按 Ctrl +D 退出”和“Exciting Function”的输出之间无限交替运行。有什么方法可以更好地处理此输入的错误?

我尝试将 while 条件更改为 getLine(cin,input),但无济于事。不过,我正在考虑使用输入流。

//get the user input. return true if all the strings are made of only alphanumeric characters
bool getUserStrings(vector<string>& usrVec)
{
    string input;
    vector<string>::iterator lp;
    string::iterator lp2;
    cout << "Please enter strings and press Ctrl D to quit" << endl;
    while (cin >> input)
    {
        usrVec.push_back(input);
    }

    for (lp = usrVec.begin(); lp != usrVec.end(); lp++)
    {
        for (lp2 = lp->begin(); lp2 != lp->end(); ++lp2)
        {
            if (*lp2 < 'A' || *lp2 > 'Z' || *lp2 < 'a' || *lp2 > 'z'
                || *lp2 < '0' || *lp2 > '9')
            {
                cout << "Exciting function" << endl;
                return false;
            }
        }
    }

    cout << "Happy Function" << endl;
    return true;
}

int main()
{
    vector<string> userStrings;
    while (!getUserStrings(userStrings))
}

最佳答案

您的问题是,即使输入为空,您也会返回 true。您可以通过多种方式解决此问题,但我的方式是刷新标准输入。

if (cin.eof()) {
    cin.clear();
    cin.ignore(input.size());                                             
}

我会把它放在你的外层 for() 循环之后。

关于c++ - 为什么输入流不识别 Ctrl D 而给出一个无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55582234/

相关文章:

c++ - 实际上对碎片内存进行碎片整理,就好像它在 C++ 中是连续的一样

c++ - 应用程序在转移到另一台电脑时无法运行

c++ - SCIP中的分支和价格

c++ - 如何将流读入 Concurrency::streams::streambuf<uint8_t> 缓冲区;在 C++ 中

c++ - C++17 中的数组赋值

c++ - 使用observer_ptr

c++ - 在 qt 的子目录项目中找不到 header

c++ - CComPtr 和 std::shared_ptr 互操作性

c++ - 如何优雅地使用 const 值放置可选值

c++ - 可变参数模板与使用元组在参数中添加不同的数据对