我正在编写一个程序,我必须验证用户输入的值是否为有效的浮点数。所以,我尝试过这种方法:
string test;
cin >> test;
float n;
n = atof(test.c_str());
cout << n << endl;
但它似乎没有完成这项工作;转换时,.
之后的数字会丢失。如何验证在C ++(而不是11)中使用了有效的浮点数?
示例:
INPUT: 32.e
OUTPUT: 32 (should be error)
INPUT: 2a.1234
OUTPUT: 2 (should be error)
答案 0 :(得分:3)
当您使用格式化读取并结合检查是否所有内容都被读取时,您可以确定[complete]值是否是有效的浮点数,例如:
int main()
{
for (std::string test; std::cin >> test; ) {
std::istringstream in(test);
double value;
if (in >> value >> std::ws && in.eof()) {
std::cout << "the string '" << test << "' is a valid floating point number\n";
}
else {
std::cout << "the string '" << test << "' is not a valid floating point number\n";
}
}
}
测试确实忽略了字符串周围的空白。如果不希望这样,可以使用操纵器std::noskipws
,并且可以省略std::ws
的使用。或者,您可以使用strtod()
确定整个值是否表示浮点数。
atof()
只是查看其参数的初始字符串是否为有效的浮点数,这是您引用的示例的情况。
答案 1 :(得分:1)
int main() {
float f;
cin >> f;
if (!cin.fail()) {
cout << f << endl;
} else {
cout << "Invalid input" << endl;
}
// your code goes here
return 0;
}
fail()
函数检查流上的failbit
和badbit
。如果I / O操作存在逻辑错误(例如:尝试读取浮点数,但无法将令牌解析为浮点数),则failbit
表示您想要的信号,并且badbit
信号是否存在是I / O操作的读/写错误(根本无法读/写令牌)。
答案 2 :(得分:0)
答案实际上取决于您是否需要验证整行输入。即使只有输入的开头是浮点数(例如3.3a,4.72abc),atof也会工作。如果您希望验证所有输入流,那么您将必须使用getline读取字符串并解析它。只需检查是否存在数字加上一个'。'。
我认为C ++ faq lite的基本理念。 http://www.parashift.com/c++-faq/istream-and-ignore.html
我的例子是循环的,这样你就可以更容易地看到我的意思了。
#include <iostream>
#include <limits>
int main()
{
while(true)
{
double value = 0;
while ((std::cout << "Enter a floating point number\n ")
&& !(std::cin >> value)) {
std::cout << "\nThat's not a floating point number\n ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
std::cout << "You entered " << value << "\n";
}
return 0;
}