7

我在网上找到了这段代码作为对字符串进行浮点/整数/双精度转换的模板。它只是在这里,所以我有一些东西可以参考这个问题......

我想让用户输入一个数字作为字符串,将其转换为浮点数,测试它是否成功,如果输入为“Q”则退出,如果不是“Q”字符则打印“无效输入”和返回以获得更多输入。

转换失败测试的语法是什么?会是 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;
}
4

3 回答 3

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
}

没有必要使用失败。

于 2012-10-18T06:46:45.643 回答
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
    }
}

显然,在大多数情况下,您只是不立即捕获异常并让它在调用链中冒泡,因此成本大大降低。

于 2012-10-18T09:26:45.880 回答
0

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

  1. 输出两倍于输入浮点数的值
  2. 报告无效输入
  3. 即使在遇到无效输入后也继续寻找浮点数
  4. 看到“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
于 2012-11-25T16:24:13.640 回答