В портативном C, это простой в использовании snprintf
для расчета размер требуемого массива, а затем sprintf
для фактического преобразования. Например:
char buffer[snprintf(NULL, 0, "%d", x) + 1];
sprintf(buffer, "%d", x);
Это стоит отметить, что это не будет работать до C99, и есть также аккуратнее альтернатива, которая работает до С99 и типа общих для всех целых. Это описано в another answer to this question using the multiplication trick, однако я заметил, что предложенный трюк не является строго переносимым. В средах, где CHAR_BIT
не 8 (например, некоторые DSP используют 16- или 32-разрядные байты), вам нужно будет изменить множитель.
Я представил a similar trick in response to a different question. Этот код использовал CHAR_BIT
, чтобы обеспечить переносимость, даже если CHAR_BIT
изменяется. Он представлен как макрос, и поэтому он внутренне документирует; он говорит вам, что такое описание высокого уровня, которое само по себе не может сделать.
#include <limits.h>
#include <stddef.h>
#include <stdio.h>
#define digit_count(num) (1 /* sign */ \
+ sizeof (num) * CHAR_BIT/3 /* digits */ \
+ (sizeof (num) * CHAR_BIT % 3 > 0)/* remaining digit */ \
+ 1) /* NUL terminator */
int main(void) {
short short_number = -32767;
int int_number = 32767;
char short_buffer[digit_count(short_number)] = { 0 };
char int_buffer[digit_count(int_number)];
sprintf(short_buffer, "%d", short_number);
sprintf(int_buffer, "%d", int_number);
}
Вы используете gcc? 'asprintf' - ваш друг, если да. – Dan
Если 'aint' представляет собой 32-разрядную (подписанную или неподписанную) величину, то достаточно 12 символов (10 цифр, знак, завершающий нуль). Если это 64-разрядная подписанная величина, то достаточно 21 символа (19 цифр, знак, завершающий нуль); для беззнакового количества без знака 21 достаточно, но со знаком вам нужно 22. Обычный трюк состоит в том, чтобы выделить немного больше места, чем необходимо. Вы можете проверить возвращаемое значение из 'snprintf()' с нулевой строкой и нулевой длиной, чтобы найти, сколько места вам нужно. Вы можете посмотреть на 'asprintf()', как это было предложено, но оно довольно новое и по-прежнему имеет ограниченную переносимость. –