将Char数组浮动到std :: string

时间:2011-09-29 14:36:55

标签: c++ string std

我对这段代码有点问题:

string StringServices::ToStringf(float value)
{
    char buffer[10]; 

    sprintf (buffer, "%f", value);

    return  (string) buffer; // signal SIGABRT
}

它以前一直在工作并继续为其他调用工作,但是当函数传递到-211.0时,我当前在返回时得到一个SIGABRT

缓冲区加载很好,我真的不确定为什么这不起作用。能理解std :: string和c弦的人能帮到我吗?

2 个答案:

答案 0 :(得分:7)

由于您没有使用snprintf,您可能会溢出缓冲区。你有这个标记的C ++,所以这样做:

std::string buffer = boost::lexical_cast<std::string>(value);

或者没有提升使用字符串流:

std::ostringstream os;
os << value;
// os.str() has the string representation now.

答案 1 :(得分:1)

C及其字符串函数的主要问题是您必须手动完成太多工作。在C语言写作时,您还必须做出太多决定。其中一个重要问题是缓冲区溢出。请考虑以下代码:

char buf[5]; // 5 chars, ok
sprintf(buf, "qwert"); // 5 letters, ok

您将遇到此代码的问题,因为在谈论字符串时,5个字符表示4个字母+ '\0'。所以,你可以试试:

printf("'%s'\n", buf); // you'll probably get 'qwertIOUYOIY*&T^*&TYDGKUYTU&*#*#T^&#$T67...'

你对代码的处理是一个简单的缓冲区溢出: - )

sprintf()无法检查buf的大小,因此在buf之后的一段内存可能会被破坏。