当涉及到基于一组指令创建程序时,我在设计伪代码和实现实际代码方面做得很好。我觉得我缺少的是检查用户的输入(无论是有效还是无效)。当我练习编程时,我创建了自己的方法来检查用户输入的有效性。但代码很长,我觉得它还不够(我会解释为什么)。我想知道是否有更好的方法来检查用户的输入。其他程序员如何实现他们的代码。
这就是我验证用户输入的方式:
if(cin.fail()) {
cout << "Invalid Input" << endl;
cout << "Now Exiting..." << endl;
return;
}
// I didn't know how to skip a line while in code
while(input < 0) {
cout << "Invalid Input" << endl;
cout << "Enter radius: " << endl;
cin >> input;
if(cin.fail()) {
cout << "Error: Invalid Input" << endl;
cout << "Now Exiting..." << endl;
return;
}
}
当 cin 无法将值单独存储到变量中时(第 1 - 5 行,第 11 -15 行),我退出的原因是因为如果我将 cin.fail() 添加到 while 条件并尝试输入一个字母,它开始无限循环。我做了一些研究,发现你必须先 cin.sync(),然后 cin.clear()。但我仍然得到无限循环。
这是代码:
do {
cin.sync()
cin.clear();
cout << "Enter radius: ";
cin >> input;
} while(input < 0 || cin.fail());
如果我做错了什么,找到更好的方法来验证用户的输入将会非常有帮助。
最佳答案
我不建议使用 std::cin,因为它会在输入缓冲区中第一个找到的空白实例之后留下所有剩余的用户输入。除非您使用 cin.ignore() 删除剩余的字符,否则这会产生问题。通常认为使用 getline() 是更好的做法,它将获取换行符之前的所有字符。如果您选择使用 std::cin,则需要使用 cin.ignore() 删除剩余字符,并使用 cin.clear() 重置 cin 的失败位,以便 while 条件下一次通过循环。
下面是我解决这个问题的方法。它使用 getline() 获取所有字符,并使用 stringstream 将字符串转换为 int。请注意,您需要像使用 cin 一样清除 stringstream 的失败位,以确保当您在 while 条件中执行 ss >> 结果时条件正常工作。
std::cout << "Enter radius: ";
getline(std::cin, input);
std::stringstream ss(input);
while(!(ss >> result)) {
std::cout << "Invalid Input" << std::endl;
std::cout << "Enter radius: ";
getline(std::cin, input);
ss.clear();
ss << input;
}
下面我还将包含一些使用 std:cin 解决问题的代码。不过我仍然建议使用 getline() 。注意:std::numeric_limits::max() 用于指定从输入缓冲区中删除多少个字符。使用它而不是您自己的任意数字是更好的做法,因为您无法确定用户将输入多少个字符。 cin.ignore() 将删除给定数量之前的所有字符,或者直到到达作为第二个参数提供的字符实例,在本例中为换行符 ('\n')。
std::cout << "Enter radius: ";
std::cin >> result;
while(std::cin.fail()) {
std::cout << "Invalid Input" << std::endl;
std::cout << "Enter radius: ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin >> result;
}
关于c++ - 如何检查用户输入是否有效? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276482/