我希望此代码检查输入是否为int,并且在我输入float类型号之前它可以正常工作。我需要一个不会通过浮点数的程序。
bool error;
int x;
string s;
do
{
cout <<"number: ";
cin >> x;
error=cin.fail();
if(error)
{
cout << "error" <<endl;
cin.clear();
}
getline(cin,s);
}while(error);
cout << x;
答案 0 :(得分:0)
std::istream& operator(std::istream&, int)
将读取一个有效的整数,直到任何不匹配的字符,如'.'
,并且到目前为止,流不会设置错误状态。
您最好将std::string
完整(空白空间)块读取,并检查它们是否包含所需格式(例如使用std::regex
)。
std::stoi()
也应该失败并发生异常。
答案 1 :(得分:0)
我认为,你正在寻找类似这样的东西(C ++ 11):
auto s = std::string{};
std::cin >> s;
if( std::all_of(std::begin(s), std::end(s),
[](char c) -> bool {
return c <= '0' && c <= '9';
}) ) {
std::cout << "you have entered an integer" << std::endl;
}
不知怎的,我想,标准库包含一个谓词,用于检查给定的char是否为数字,但我现在找不到它。这种假设is_digit()
将使代码更具可读性:
if( std::all_of(std::begin(s), std::end(s), std::hypothetic::is_digit) ) {
std::cout << "you have entered an integer" << std::endl;
}
答案 2 :(得分:0)
以字符串then convert the string to an integer with std::stoi读取所有用户的输入行。
不幸的是,当std :: stoi到达可转换字符的末尾时,它会愉快地停止转换,但是它允许您传入指向要使用结束转换的字符更新的位置的指针。如果这个位置不是字符串的结尾,那么就行了垃圾。
bool error = true; // assume user input is wrong
while (error)
{
if (std::getline(std::cin, s)) // grab the whole line
{
std::size_t end;
try
{
x = std::stoi(s, &end);
if (end == s.length()) // converted all user input
{
error == false; // good data
}
}
catch(std::invalid_argument &) // user input is complete garbage
{
}
catch(std::std::out_of_range &) // converted user input is too big for int.
{
}
}
}
^
我建议将输入循环转换为函数。 1)如果您需要再次转换int
,它很容易重复使用。 2)它摆脱了上面的一些逻辑,因为你可以return
在输入被测试时很好。
int gimmieInt(std::istream& in) // Me eat input stream! Om nom nom nom!
{
std::string s;
int x;
while (true) // consider instead using a maximum number of retries.
// This increases complexity, so consider it *after* you have
// the basic version working
{
if (std::getline(in, s))
{
std::size_t end;
try
{
x = std::stoi(s, &end);
if (end == s.length())
{
return x;
}
}
catch(std::invalid_argument &) // user input is complete garbage
{
}
catch(std::std::out_of_range &) // user input is too big for int.
{
}
}
}
}