Как записать форматированный вывод, как из printf, в строку? - PullRequest
0 голосов
/ 24 февраля 2020
const char* strrep(listing list) {
//https://stackoverflow.com/q/4836534/9295513
char* retVal = //...
return retVal;
}

У меня есть тип структуры с именем listing. Есть ли способ отформатировать элементы, как будто вызывая printf с ("%d %d %s...", list->elem_one, list->elem_two, list->elem_three...), но записывая вывод в массив char вместо стандартного вывода?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

Функция, которую вы хотите: snprintf. Он создает отформатированную строку и записывает ее в заданный аргумент char * с заданным размером вместо stdout.

Например:

int len = snprintf(NULL, 0, "%d %d %s...", list->elem_one, list->elem_two, list->elem_three...);
char *retVal = malloc(len+1);
snprintf(retval, len+1, "%d %d %s...", list->elem_one, list->elem_two, list->elem_three...);

Первый вызов используется для выяснения сколько места нужно. Затем вы можете выделить необходимое количество места и снова вызвать snprintf, чтобы создать отформатированную строку.

1 голос
/ 24 февраля 2020

Если я правильно понял, вы хотите печатать в буфер, а не в консоль или файл. Если это так, вы можете использовать sprintf или его двоюродного брата snprintf. Вот пример с веб-сайта cplusplus :

#include <stdio.h>

int main ()
{
  char buffer [50];
  int n, a=5, b=3;
  n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
  printf ("[%s] is a string %d chars long\n",buffer,n);
  return 0;
}

Обратите внимание, что sprintf автоматически добавляет нулевой терминатор, но вам все равно нужно убедиться, что общая длина строки может вписывается в данный буфер.

...