我在网上发现这个代码作为模板,用于执行字符串到float / int / double转换。它只是在这里,所以我有一些东西可以参考这个问题......
我想让用户输入一个数字作为字符串,将其转换为浮点数,测试它是否成功,如果输入为'Q'则退出或打印“无效输入”如果不是'Q' uit字符并返回以获得更多输入。
转换失败测试的语法是什么?它会是ss.fail()吗?
// using stringstream constructors.
#include <iostream>
#include <sstream>
using namespace std;
int main () {
int val;
stringstream ss (stringstream::in | stringstream::out);
ss << "120 42 377 6 5 2000";
/* Would I insert an
if(ss.fail())
{
// Deal with conversion error }
}
in here?! */
for (int n=0; n<6; n++)
{
ss >> val;
cout << val*2 << endl;
}
return 0;
}
答案 0 :(得分:9)
您的代码不是很有帮助。但是,如果我理解你就是这样做的
string str;
if (!getline(cin, str))
{
// error: didn't get any input
}
istringstream ss(str);
float f;
if (!(ss >> f))
{
// error: didn't convert to a float
}
没有必要使用失败。
答案 1 :(得分:2)
实际上,执行字符串到浮点转换的最简单方法可能是boost::lexical_cast
#include <string>
#include <boost/lexical_cast.hpp>
int main() {
std::string const s = "120.34";
try {
float f = boost::lexical_cast<float>(s);
} catch(boost::bad_lexical_cast const&) {
// deal with error
}
}
显然,在大多数情况下,你只是不会立即发现异常并让它冒出呼叫链,因此成本会大大降低。
答案 2 :(得分:0)
原始问题要求的一些功能是:
我认为以下代码符合上述要求:
// g++ -Wall -Wextra -Werror -static -std=c++11 -o foo foo.cc
#include <iostream>
#include <sstream>
void run_some_input( void )
{
std::string tmp_s;
int not_done = 1;
while( not_done && getline( std::cin, tmp_s ) )
{
std::stringstream ss;
ss << tmp_s;
while( ! ss.eof() )
{
float tmp_f;
if ( ss >> tmp_f )
{
std::cout << "Twice the number you entered: "
<< 2.0f * tmp_f << "\n";
}
else
{
ss.clear();
std::string tmp_s;
if( ss >> tmp_s )
{
if( ! tmp_s.compare( "Q" ) )
{
not_done = 0;
break;
}
std::cout << "Invalid input (" << tmp_s << ")\n";
}
}
}
}
}
int main( int argc __attribute__ ((__unused__)), char **argv __attribute__ ((__unused__)) )
{
run_some_input();
}
这是一个示例会话:
$ ./foo
1
Twice the number you entered: 2
3 4
Twice the number you entered: 6
Twice the number you entered: 8
5 bad dog Quit 6 8 Q mad dog
Twice the number you entered: 10
Invalid input (bad)
Invalid input (dog)
Invalid input (Quit)
Twice the number you entered: 12
Twice the number you entered: 16