我想知道这样的功能是否存在:
void str_realloc_and_concat(char *str, const char *format, ...)
此函数将采用char * str(已分配或NULL),并附加到*格式。 我正在寻找类似sprintf的东西,包括重新定位,strcpy和concatenation。
它是否存在或我是否需要编码?感谢您的投入。
更新 该库必须在嵌入式设备上使用,所以我不想使用GNU扩展,因为我不确定我会有它们。
答案 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的asprintf
与sprintf
类似,但是分配结果(足够大)。
char *res = NULL;
const char *str = "other string";
int ret = asprintf(&res, "Hi %d %s\n", 2, str);
连接只是使用格式字符串的特例..如果我理解正确的话。