Некоторые здесь утверждает, что этот подход является излишеством, и для преобразования Интсов в строки, я мог бы быть более склонен согласиться. Но когда разумная привязка к размеру строки не может быть найдена, я видел, что этот подход используется и использовал его сам.
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
, когда большую часть времени вы будете использовать только небольшую часть из них, то я не думаю это плохой подход.
Конечно, если вы используете C++, вместо этого вы можете просто использовать std :: string и std :: stringstream для достижения того, чего вы хотите, даже не думая о требованиях к памяти. Но это действительно зависит. Я знаю, что вопрос для C, но, возможно, это может быть полезно в любом случае. –
@Robert: если вместо этого используется Python, вы можете использовать 'str'; -p –
@Steve Я вижу вашу точку зрения, просто хотел посмотреть, просто ли плакат только что прыгнул на C, когда им это не нужно. –