Некоторые здесь утверждают, что этот подход является излишним, и для преобразования целых в строки я мог бы быть более склонен согласиться.Но когда разумный предел для размера строки не может быть найден, я видел этот подход и использовал его сам.
int size = snprintf(NULL, 0, "%d", 132);
char * a = malloc(size + 1);
sprintf(a, "%d", 132);
Я разобью, что здесь происходит.
- В первой строке мы хотим определить, сколько символов нам нужно.Первые 2 аргумента
snprintf
говорят, что я хочу записать 0 символов результата в NULL
.Когда мы сделаем это, snprintf
на самом деле нигде не будет писать никаких символов, он просто вернет количество символов, которое было бы написано.Это то, что мы хотели. - Во второй строке мы динамически распределяем память для указателя
char
.Удостоверьтесь и добавьте 1 к необходимому размеру (для завершающего \0
завершающего символа). - Теперь, когда для указателя
char
выделено достаточно памяти, мы можем смело использовать sprintf
для записицелое число к указателю char
.
Конечно, вы можете сделать его более кратким, если хотите.
char * a = malloc(snprintf(NULL, 0, "%d", 132) + 1);
sprintf(a, "%d", 132);
Если это не «быстрая и грязная» программа, вывсегда нужно обязательно освободить память, которую вы вызывали с помощью malloc
.Это где динамический подход усложняется с C. Однако, IMHO, если вы не хотите выделять огромные char
указатели, когда большую часть времени вы будете использовать только очень небольшую их часть, тогда я не будуНе думаю, что это плохой подход.