为什么输入流无法识别 Ctrl D 并给出无限循环



我正在尝试读取用户键入的字符,直到按下 Ctrl+ D。在执行我的代码时,循环似乎在"请输入字符串并按 Ctrl +D 退出"和"激发功能"的输出之间无限交替运行。有没有办法更好地错误处理此输入?

我尝试将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()循环之后。

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

如果你对坏角色的条件看起来会在每个可以想象的角色身上开火,你可能需要在那里放一些&&和括号。(好的,我在评论中看到您注意到了,最好编辑问题(

问题是这行代码:

while (!getUserStrings(userStrings));

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

while (std::cin >> input)

但是,getUsersString 返回 false。 !将其转换为true,代码进入无限循环

只需更改

while (!getUserStrings(userStrings));

while (getUserStrings(userStrings));

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

#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));
}

最新更新