我正在以浮动方式获取输入。例如,如果用户输入3.5,那么它可以正常工作。如果用户输入3.X或任何其他字符,则会导致无限循环。有什么方法可以验证变量,以便用户只能输入数字?我正在使用gcc编译器。
答案 0 :(得分:2)
通常的方法是将数据作为字符串读取,然后将其转换为float,并查看在该转换中消耗的整个输入字符串。提升lexical_cast
(例如)可以为您自动完成大部分操作。
答案 1 :(得分:1)
你没有提供任何示例代码,所以我们可以看到你在做什么,但我 怀疑你正在做的事情:
while ( ! input.eof() ) {
double d;
input >> d;
// do someting with d...
}
这有两个问题:第一个是一旦发生错误
(因为'X'
不能成为double
的一部分),因此流会记住。{
错误,直到它被明确清除,因此所有后续输入也会失败
(并且不会从字符串中提取更多字符)。当你
在流中有格式错误,有必要重置错误
继续之前的状态。
上述第二个问题是input.eof()
并不意味着
直到输入失败之后;它不是一个非常有用的功能。
你可能想做的是:
double d;
while ( input >> d ) {
// do something with d
}
这将停止读取第一个错误。如果你想恢复 错误并继续,那么你需要更精细的东西:
double d;
while ( input >> d || !input.eof() ) {
if ( input ) {
// do something with d...
} else {
// format error...
input.clear(); // reset the error state...
// advance the stream beyond the error:
// read to next white space (or EOF), or at least
// advance one character.
}
}
或者,它通常比其他人建议的更强大, 逐行读取输入,然后扫描行:
std::string line;
while ( std::getline( input, line ) ) {
std::istringstream l( line );
double d;
if ( l >> d >> std::ws && d.get() == EOF ) {
// do something with d...
} else {
// format error...
// we don't have to clear or skip ahead, because we're
// going to throw out the istringstream anyway, and the
// error didn't occur in the input stream.
}
}
这强加了一种更严格的格式:每行一个值,但是如果 你计算行数,你可以在错误中输出行号 信息;必须纠正错误输入的人会欣赏 这一点。
答案 2 :(得分:0)
try
{
double x = boost::lexical_cast<double>(str); // double could be anything with >> operator.
}
catch(...) { oops, not a number }
答案 3 :(得分:0)
从输入中读取double值并确保其形成良好的最佳方法是将输入作为字符串读取,然后使用stdlib
库中包含的标准strtod
函数对其进行解析。 / p>
有关解析该字符串时某些不同可能性的更详细说明,您可以查看this其他帖子。
答案 4 :(得分:0)
你的帖子我有些不清楚,但据我所知,我认为你应该使用strtof
。
从用户那里获取数据作为String,而不是使用函数转换为float并通过比较指针检查是否成功。
有关详细信息,请查看strtof
的手册页。