使用stringstream浮动的字符串

时间:2012-10-18 05:19:27

标签: c++ stringstream

我在网上发现这个代码作为模板,用于执行字符串到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;
}

3 个答案:

答案 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)

原始问题要求的一些功能是:

  1. 输出两次输入浮点值
  2. 报告无效输入
  3. 即使在遇到无效输入后仍继续寻找花车
  4. 看到'Q'字符后停止
  5. 我认为以下代码符合上述要求:

    // 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