我对这段代码有点问题:
string StringServices::ToStringf(float value)
{
char buffer[10];
sprintf (buffer, "%f", value);
return (string) buffer; // signal SIGABRT
}
它以前一直在工作并继续为其他调用工作,但是当函数传递到-211.0时,我当前在返回时得到一个SIGABRT
缓冲区加载很好,我真的不确定为什么这不起作用。能理解std :: string和c弦的人能帮到我吗?
答案 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之后的一段内存可能会被破坏。