我正在尝试读取用户键入的字符,直到按下 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));
}