2010-04-15 5 views
1

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

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

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

+6

Ответы для разных C и C++, которые вы на самом деле программируете? –

ответ

4
std::stringstream ss; 
ss << 3; 
std::string s = ss.str(); 
assert(!strcmp("3", s.c_str())); 
+0

или 'assert (" 3 "== s);' – user102008

0

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

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

, который будет выделять буфер для вас.

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

+0

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

0

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

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

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

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); 
Смежные вопросы