преобразование int в char *

1

Это очень простой вопрос, и я знаю, что один из способов - сделать следующее:

char buffer[33];
itoa(aq_width, buffer,10);

где aq_width - это int, но тогда я не могу гарантировать, какой размер буфера мне понадобится для этого... Я всегда могу выделить очень большой размер буфера, но это было бы не очень приятно... любой другой красивый и простой способ сделать это?

  • 6
    Ответы совершенно разные для C и C ++, на чем вы на самом деле программируете?
Теги:

4 ответа

4
Лучший ответ
std::stringstream ss;
ss << 3;
std::string s = ss.str();
assert(!strcmp("3", s.c_str()));
  • 0
    или assert("3" == s);
2

Вы можете рассчитать верхнюю границу требуемого размера буфера с помощью этого макроса (для подписанных типов):

#define MAX_SIZE(type) ((CHAR_BIT * sizeof(type) - 1) / 3 + 2)

Кстати, itoa() не является стандартным C и недоступен везде. snprintf() выполнит задание:

char buffer[MAX_SIZE(aq_width)];
snprintf(buffer, sizeof buffer, "%d", aq_width);
0

Есть более эффективные способы памяти, но они не являются "простыми".

Рассмотрим стоимость 100 байт памяти, скажем, одну секунду. Гигабайт на всю жизнь за десять лет стоит, что, 10 долларов? Мы говорим о наноцентах здесь.

Сделайте буфер слишком большим. Обратите внимание, что 32-разрядный int не может содержать более десяти цифр в десятичной форме, а 64-разрядный int не может быть больше 20.

0

Хорошая функция от glibc asprintf, используемая как

char * buffer = NULL;
int buffer_size = asprintf(&buffer,"%d",aq_width);
assert(buffer_size >= 0);
...
free(buffer)

который выделит вам буфер.

Более портативно вы можете использовать snprintf, который вернет количество символов, которое вам нужно выделить.

  • 0
    Если он использует itoa , он, вероятно, не использует glibc ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню