Float to Char Массив в std :: string - PullRequest
       9

Float to Char Массив в std :: string

1 голос
/ 29 сентября 2011

У меня есть небольшая проблема с этим фрагментом кода:

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

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

    return  (string) buffer; // signal SIGABRT
}

Он работал ранее и продолжает работать для других вызовов, но в настоящее время я получаю SIGABRT при возврате, когдапередается функция -211.0

Буфер загружается нормально, и я действительно не уверен, почему это не работает.Может ли кто-нибудь, кто понимает std :: string и c strings, намного лучше, чем я, помочь мне здесь?

Ответы [ 2 ]

7 голосов
/ 29 сентября 2011

Возможно, вы переполнили буфер, потому что вы не используете snprintf. У вас есть этот тег C ++, так что делайте так:

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

Или без буста используйте строковый поток:

std::ostringstream os;
os << value;
// os.str() has the string representation now.
1 голос
/ 29 сентября 2011

Основная проблема с 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поэтому часть памяти, которая идет сразу после буфера, может быть повреждена.

...