Построение строки в 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,

Другие вопросы по тегам