使用stringstream从空字符串转换为float会导致非零值

时间:2013-08-26 18:29:40

标签: c++ type-conversion stringstream

我试图通过之前回答的问题来解决这个问题,例如Conversion from string to float changes the number,但我没有成功。

在我的代码中,我带了一个充满''字符的字符串,并使用stringstream将其转换为float。它工作正常(给我一个零值漂浮),直到我在那之后进行另一次转换。之后执行转换时,先前转换的浮点数中存储的值不为零,而是4.57048e-41。我希望以下代码能更清楚地解释我的问题。

我开始时:

std::stringstream ss;
float a;
float b;
for(int i=0; i<LIM; ++i){
    //some other conversions using same stringstream
    //clearing stringstream    
    ss.str( std::string() );
    ss.clear();

    ss << str1;    //string full of empty spaces, length of 5
    ss >> a;
    std::cout << a;//prints zero
}

这很好用,但当我把它改成

std::stringstream ss;
float a;
float b;
for(int i=0; i<LIM; ++i){
    //some other conversions using same stringstream
    //clearing stringstream    
    ss.str( std::string() );
    ss.clear();

    ss << str1;    //string full of empty spaces, length of 5
    ss >> a;
    std::cout << a;//prints 4.57048e-41

    ss.str ( std::string() );
    ss.clear();

    ss << str2;    //another string full of empty spaces, length of 5
    ss >> b;
    std::cout << b;//prints zero
}

我正在使用带有以下标志的gcc 4.6.3:  -o2 -Wall -Wextra -ansi -pedantic

任何形式的帮助将不胜感激,但我不愿意使用双打。

非常感谢!

1 个答案:

答案 0 :(得分:2)

如果转换失败,则不会更改目标值。在您的情况下,它仍然具有其原始的未初始化值;所以打印它会产生垃圾或其他未定义的行为。

您应该检查转换是否成功:

if (!(ss >> a)) {
    a = 0; // or handle the failure
}

或使用C ++ 11中的std::stofboost::lexical_cast之类的转换函数,它们会指示转换失败。 (或者,如评论中所述,如果您不需要检测失败,只需将其设置为零即可开始。)