Существует ли такая функция?void str_realloc_and_concat (char * str, const char * format, ...) - PullRequest
0 голосов
/ 17 ноября 2011

Мне интересно, существует ли такая функция:

void str_realloc_and_concat(char *str, const char *format, ...)

Эта функция будет принимать символ * str (распределенный или NULL) и добавлять к нему * формат.Я ищу что-то вроде sprintf с переопределением, strcpy и конкатенацией.

Это существует или мне нужно кодировать это?Спасибо за ваш вклад.

Обновление Библиотека должна использоваться на встроенном устройстве, поэтому я не хочу использовать расширения GNU, поскольку я не уверен, что они у меня будут.

Ответы [ 3 ]

1 голос
/ 17 ноября 2011

Вот реализация такой функции.Насколько мне известно, стандартная библиотека C не содержит функции, подобной той, которую вы ищете.Обратите внимание, что я бы рекомендовал передать целевую строку как двойной указатель, поскольку realloc может изменить указатель:

#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>

const char *prefix = "Hello";

void str_realloc_and_concat(char **str, const char *format, ...)
{
    va_list ap;
    int i, n;
    char *s;

    n = strlen(*str);
    va_start(ap, format);
    i = vasprintf(&s, format, ap);
    *str = (char *)(realloc(*str, n + i + 1));
    if (*str != NULL)
        strncpy(&(*str)[n], s, i);
    va_end(ap);
}

int main()
{
    char *s = (char *)(malloc(strlen(prefix)));
    strncpy(s, prefix, strlen(prefix));
    str_realloc_and_concat(&s, " %s", "world!");
    printf("%s\n", s);
    return 0;
}
1 голос
/ 23 декабря 2011

Я решил пойти с этим. Надеюсь, это поможет.

/**
 * Reallocate a string and concatenate it with a formatted string.
 * The src string has to be allocated by malloc/calloc.
 * @param src Pointer to the original string
 * @param format Format string
 * @param ... Arguments that are to be formatted
 */
char *strcatf(char *src, const char *format, ...)
{
  va_list ap, cp;
  int format_length;
  size_t translation_length;
  char *dest;

  if (NULL == src) {
    return NULL;
  }

  va_start(ap, format);
  va_copy(cp, ap);

  translation_length = strlen(src);
  format_length = vsnprintf(NULL, 0, format, cp);
  if ((dest = realloc(src, (translation_length + format_length + 1) * sizeof(char))) == NULL) {
    free(src);
  } else {
    vsprintf(&(dest)[translation_length], format, ap);
  }
  va_end(ap);
  va_end(cp);
  return dest;
}
0 голосов
/ 17 ноября 2011

У этого нет части realloc, но он выделяет.asprintf в GNU libc похожа на sprintf, но выделяет результат (достаточно большой).

char *res = NULL;
const char *str = "other string";
int ret = asprintf(&res, "Hi %d %s\n", 2, str);

Конкатенация - это просто особый случай использования строки формата ... если я правильно понимаю.

...