使用 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

stringstream、string 和 char* 转换混淆

❥关于C++之stringstream典型用法

❥关于C++之stringstream典型用法

使用 ostringstream 或 stringstream 将 C++ Int 转换为字符串