gpt4 book ai didi

c - 使用 stdarg 重新分配

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:15 27 4
gpt4 key购买 nike

我正在尝试使用 stdarg (library) header 连接字符串,但我做错了。使用 realloc 连接字符串有更简单的方法吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
void concatenaCodigo(char *string, char *format, ...){
va_list args;
va_start(args, format);
int n = vsnprintf(NULL, 0, format, args);
string = (char*) realloc (string, n);
if (string != NULL) {
printf("Realloc OK!\n");
vsprintf(string, format, args);
va_end(args);
}
else {
free (string);
puts ("Error (re)allocating memory");
exit (1);
}

}
int main(){
char *codigoC = NULL;
concatenaCodigo(codigoC, "Test%s%s","asd","asd");
printf("%s\n", codigoC);
}

我做了修改。代码应该如下所示?连接尚未生效。

char* concatenaCodigo(char *format, ...){
va_list args;
va_start(args, format);
int n = vsnprintf(NULL, 0, format, args);
char * newString;
newString = (char*) malloc(n);
vsprintf(newString, format, args);
va_end(args);
return newString;
}
int main(){
char *codigoC = NULL;
codigoC = concatenaCodigo("Test%s%s", "asd", "asd");
printf("%s\n", codigoC);
}

最佳答案

修改后的代码中的问题是你没有重置你的 va_list适本地。你有:

char* concatenaCodigo(char *format, ...){
va_list args;
va_start(args, format);
int n = vsnprintf(NULL, 0, format, args);
char * newString;
newString = (char*) malloc(n);
vsprintf(newString, format, args);
va_end(args);
return newString;
}
int main(){
char *codigoC = NULL;
codigoC = concatenaCodigo("Test%s%s", "asd", "asd");
printf("%s\n", codigoC);
}

你需要:

char *concatenaCodigo(char *format, ...)
{
va_list args;
va_start(args, format);
int n = vsnprintf(NULL, 0, format, args) + 1; /* Note the +1! */
va_end(args); /* vsnprintf() 'uses up' args */
char *newString = (char *) malloc(n);
if (newString != 0)
{
va_start(args, format); /* Restart args */
vsprintf(newString, format, args);
va_end(args);
}
return newString;
}

int main(void)
{
char *codigoC = concatenaCodigo("Test%s%s", "asd", "asd");
if (codigoC != 0)
printf("%s\n", codigoC);
free(codigoC);
return 0;
}

请注意 <stdarg.h>是标题,而不是库。

关于c - 使用 stdarg 重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com