这样的功能存在吗? void str_realloc_and_concat(char * str,const char * format,...)

时间:2011-11-17 13:40:14

标签: c printf realloc

我想知道这样的功能是否存在:

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

此函数将采用char * str(已分配或​​NULL),并附加到*格式。 我正在寻找类似sprintf的东西,包括重新定位,strcpy和concatenation。

它是否存在或我是否需要编码?感谢您的投入。

更新 该库必须在嵌入式设备上使用,所以我不想使用GNU扩展,因为我不确定我会有它们。

3 个答案:

答案 0 :(得分:1)

这是这种功能的实现。据我所知,标准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 :(得分:1)

我决定顺其自然。希望它会有所帮助。

/**
 * 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;
}

答案 2 :(得分:0)

这没有realloc部分,但确实分配了。 GNU libc的asprintfsprintf类似,但是分配结果(足够大)。

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

连接只是使用格式字符串的特例..如果我理解正确的话。