Построение строки в C
Это похоже на вопрос, который был бы задан раньше, но я не смог его найти. (Если вы это сделаете, пожалуйста, укажите мне там и закройте это как дубликат.)
У меня есть C-код, который работает примерно так:
printf("some characters");
for (; n >= 0; n--)
{
printf(", %s", f(n, k));
}
printf("more characters");
для некоторых переменных n
а также k
и функция char* f(int n, int k)
которые здесь не важны. (n
а также k
не являются постоянными.) Я хотел бы преобразовать приведенный выше код в функцию, которая возвращает char*
а не просто используя printf
показать это. (В конечном итоге он будет напечатан, но это позволит мне провести некоторый рефакторинг и, конечно, будет проще протестировать его таким образом.) Конечно, я мог бы просто создать строки и скопировать их по буквам, но, несомненно, есть и лучшее (чище, более быстрый, более идиоматический) способ сделать это.
В моем конкретном приложении f
это очень простая функция, своего рода родственник itos
, но который не может быть кэширован каким-либо значимым образом из-за k
, Но я приветствую идеи, которые хороши для этого случая, поскольку это может быть полезно для других в будущем.
1 ответ
Шаг 1 должен был бы выделить достаточно большой буфер для строки. Тогда используйте sprintf
распечатать в буфер. Стандартная идиома
int index = sprintf( buffer, "some characters" );
for (; n >= 0; n--)
{
index += sprintf( &buffer[index], ", %s", f(n, k) );
}
index += sprintf( &buffer[index], "more characters" );
sprintf
Функция возвращает длину строки, которую она написала, что позволяет вам отслеживать, где вы находитесь в буфере.
Вы также можете сделать так, чтобы вызывающая сторона передавала буфер и размер. В этом случае лучше всего использовать snprintf
чтобы избежать переполнения буфера. Так что функция будет выглядеть примерно так
char *create_string( char *buffer, int size, int n, int k )
{
...
index += snprintf( &buffer[index], size-index, ", %s", f(n, k) );
...
return buffer;
}
где size
параметр является размером buffer
,