使用 stringstream 浮动的字符串
Posted
技术标签:
【中文标题】使用 stringstream 浮动的字符串【英文标题】:String to float using stringstream 【发布时间】:2012-10-18 05:19:26 【问题描述】:我在网上找到了这段代码作为将字符串转换为浮点/整数/双精度的模板。它只是在这里,所以我有一些东西可以参考这个问题......
我想让用户输入一个数字作为字符串,将其转换为浮点数,测试它是否成功,如果输入为“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;
【问题讨论】:
您遇到什么语法错误? 【参考方案1】:您的代码不是很有帮助。但是如果我理解你的话,就这样吧
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
没有必要使用fail。
【讨论】:
【参考方案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
显然,在大多数情况下,您只是不会立即捕获异常并让它在调用链中冒泡,因此成本会大大降低。
【讨论】:
【参考方案3】:原始问题要求的一些功能是:
-
输出两倍于输入浮点数的值
报告无效输入
即使在遇到无效输入后仍继续查找浮点数
看到“Q”字符后停止
我认为以下代码符合上述要求:
// 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
【讨论】:
以上是关于使用 stringstream 浮动的字符串的主要内容,如果未能解决你的问题,请参考以下文章
使用 stringstream::str() 更新后 C++ stringstream 无法正常工作
stringstream,ostringstream,stringstream