我正在尝试读取用户键入的字符,直到按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))
}
答案 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。 (好的,我看到您在评论中注意到了,最好编辑问题)