我似乎无法想出一大堆代码来捕获用户,直到它获得肯定的int并且如果用户意外地输入一个字符或随机垃圾如“-1-3-4-”则提示用户39-32xfi3 /”。我只需要一个整洁的防故障cin循环结构,无法搞清楚。感谢。
我只是想知道其他人在控制台输入方面做了什么,以便从中获取绘制的想法。如何绕过糟糕的输入。
答案 0 :(得分:6)
这样做:
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
int main()
{
for (std::string line; std::getline(std::cin, line); )
{
std::istringstream iss(line);
unsigned int n;
if (!(iss >> n >> std::ws) || iss.get() != EOF)
{
std::cout << "Bad input ('" << line << "'), ignoring.\n";
continue;
}
std::cout << "Success! We read: " << n << "\n";
return EXIT_SUCCESS;
}
std::cout << "Premature end of input!\n";
return EXIT_FAILURE;
}
换句话说,继续读取用户的输入,直到您能够将输入解析为所需的数据类型。我选择了基于行的处理,这通常是最自然的,但是如果不正确就可以跳过任何“记录”的概念。请注意,程序可能永远不会成功,即如果用户拒绝提供任何良好输入。
答案 1 :(得分:0)
我通常使用std::getline
读取整行,然后尝试将其转换为strtol
的整数。如果结果小于0,则会键入前导-
。 strtol
返回指向输入的第一个字符的指针,该指针无法转换为整数,因此如果它指向除\0
之外的任何字符,则表示用户输入了无法输入的内容。转换。
我真的应该转而使用std::stoi
而不是strtol
。它支持几乎相同的功能,但其输入为std::string
,而不是strtol
使用的C风格字符串。我只是继续使用strtol
出于长期习惯,而不是因为它确实是一个更好的解决方案。
根据您的可用内容以及您希望如何响应不良输入,另一种可能性是lexical_cast
。如果它不能将整个输入转换为目标类型,则抛出异常,因此如果您想要例外,它可能更方便(但如果您不想要例外,它可能只是因为你额外的工作。)