LINUX.ORG.RU

char *b; 
Это только указатель на символ. То место, на которое он указывает, не выделено.
Т.е. в sprintf(b, "%d", a) ты пытаешься писать символы просто в произвольную область памяти.

Либо так:
#include <iostream>
int main() {
  int a = 1;
  char b[16];
  sprintf(b, "%d", a); // b - это указатель на первый элемент
  std::cout << b << '\n';
  return 0;
}

Либо так:
#include <iostream>
#include <sstream>
int main() {
  int a = 1;
  std::stringstream ss;
  ss << a;
  std::cout << ss.str() << '\n';
  return 0;
}

hapchu ★★
()

нужно выделить место под строчку! если дленна строки будет не больше len, то надо делать так

int main(){ int a=1; char* b; b=(char *) malloc(len); sprintf(b,"%d", a); std::cout<<b<<"\n"; return 0;

}

anonymous
()
Ответ на: комментарий от anonymous

> Спасибо. А что предпочтительнее с точкие зрения производитеьности/правильности?

С точки зрения правильности - однозначно вариант с std::stringstream. Кстати его можно записать и в одну строчку:

int a = 1; std::cout << ((std::ostringstream&)(std::ostringstream() << a)).str() << "\n"

На любителя =)

С производительностью сложнее. С одной стороны, ostringstream не нужно тратить в рантайме время на парсинг строки формата. С другой, ему приходится динамически выделять память под буфер, плюс при возврате его из str() текст копируется, так что имеем еще и накладные расходы на создание std::string. Так что, скорее всего, s(n)printf быстрее.

int19h ★★★★
()
Ответ на: комментарий от anonymous

Насчет производительности правильности - это религиозный вопрос. Первый вариант - это С (за исключением std::cout, в С используется printf). Второй вариант - С++.

hapchu ★★
()
Ответ на: комментарий от anonymous

> int main(){ int a=1; char* b; b=(char *) malloc(len); sprintf(b,"%d", a); std::cout<<b<<"\n"; return 0;

Угу, а высвобождать потом память кто будет? Если уж len известна - проще всего объявить локальный массив. Если нет - не забываем free(). Ну и вместо malloc(len) чисто субъективно все же плюсовей будет new char[len].

int19h ★★★★
()

int i = 5;
ostringstream oss_convert;
oss_convert << i;
return oss_convert.str();

LX ★★
()
Ответ на: комментарий от int19h

Ога. Теперь еще добавим, что в процессе может например из sprintf'a или из cout'а вылететь exception, память все равно может оказаться не очищеной ;). Может strstream и медленнее, но зато надежнее.

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.