为什么输入流无法识别Ctrl D而是给出了无限循环?

时间:2019-04-08 21:47:39

标签: c++ c++17

我正在尝试读取用户键入的字符,直到按Ctrl + D为止。执行我的代码时,循环似乎在“请输入字符串并按Ctrl + D退出”和“令人兴奋的功能”的输出之间无限地交替运行。有什么方法可以更好地对输入进行错误处理?

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

//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))
}

3 个答案:

答案 0 :(得分:1)

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

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

我会将其放在外部for()循环之后。

答案 1 :(得分:1)

问题是这行代码:

while (!getUserStrings(userStrings));

您的程序使用以下代码行正确检测到Ctrl-D输入:

while (std::cin >> input)

但是,getUsersStrings返回false。 !将其变成true,并且代码进入无限循环

只需更改

while (!getUserStrings(userStrings));

while (getUserStrings(userStrings));

替代解决方案:确实不需要扫描以确保已给出非字母数字输入。在Unix系统上,Ctrl-D被解释为EOF。 while(cin >> input)输入将在达到EOF时(即达到Ctrl-D时)停止,因此在循环退出后无需扫描非字母数字。该代码可以编写如下:

#include <iostream>
#include <string>
#include <vector>
//get the user input. return true if all the strings are made of only alphanumeric characters

bool getUserStrings(std::vector<std::string>& usrVec)
{

  std::string input;
  std::vector<std::string>::iterator lp;
  std::string::iterator lp2;    
  std::cout << "Please enter strings and press Ctrl D to quit" << std::endl;
  while (std::getline(std::cin, input)) {
    usrVec.push_back(input);
  }

  std::cout << "Exiting function" << std::endl;
  std::cout << "Happy Function" << std::endl;

  return false;
}

int main()
{
  std::vector<std::string> userStrings;

  while (getUserStrings(userStrings));
}

答案 2 :(得分:1)

cin上的条件不是问题。您用输入填充userStrings,如果其中包含您不喜欢的内容,则返回false并再次运行该函数。与坏字符串仍然存在于userStrings中。我猜您可能想在某个时候放弃错误的输入?

如果不良字符的条件似乎会在所有可以想象的字符上触发,则可能需要在其中放置一些&&和parens。 (好的,我看到您在评论中注意到了,最好编辑问题)

相关问题