gpt4 book ai didi

c - vsprintf,如何在 Linux 上将 void** 转换为 va_list

转载 作者:行者123 更新时间:2023-12-05 01:22:20 24 4
gpt4 key购买 nike

我的问题 vsprintf就是不能直接获取输入参数,我得先一一获取输入并保存在void** ,然后通过这个 void**vsprintf() ,windows都可以,但是到了64位linux,gcc不能编译,因为不允许从void**转换过来至 va_list , 有没有人可以帮我看看我在linux下应该怎么做?

我的部分代码是:

void getInputArgs(char* str, char* format, ...)
{
va_list args;
va_start(args, format);
vsprintf(str, format, args);
va_end(args);
}

void process(void)
{
char s[256];
double tempValue;
char * tempString = NULL;
void ** args_ptr =NULL;
ArgFormatType format; //defined in the lib I used in the code
int numOfArgs = GetNumInputArgs(); // library func used in my code

if(numOfArgs>1)
{
args_ptr = (void**) malloc(sizeof(char)*(numOfArgs-1));
for(i=2; i<numOfArgs; i++)
{
format = GetArgType(); //library funcs

switch(format)
{
case ArgType_double:
CopyInDoubleArg(i, TRUE, &tempValue); //lib func
args_ptr[i-2] = (void*) (int)tempValue;
break;

case ArgType_char:
args_ptr[i-2]=NULL;
AllocInCharArg(i, TRUE, &tempString); //lib func
args_ptr[i-2]= tempString;
break;
}
}
}

getInputArgs(s, formatString, (va_list) args_ptr); /////Here is the location where gcc cannot compile
}

非常感谢!!

最佳答案

问题是,你的函数得到 ... ,但您传递给它的是 va_list . ...用于这样的用法:

 getInputArgs(s, formatString, arg1, arg2, arg3, arg4 /* etc */);

它不适用于 va_list .不幸的是,没有一种简单的方法来创建 va_list从不同的参数而不是从 ... 获取它.见 this question例如。

你应该做的是改变你想要打印到字符串的方式。

你可以有:
char s[256];
int so_far = 0;

而在你的 for 循环中,而不是这样的:
CopyInDoubleArg(i, TRUE, &tempValue);   //lib func
args_ptr[i-2] = (void*) (int)tempValue;

你写:
CopyInDoubleArg(i, TRUE, &tempValue);   //lib func
if (so_far < 256) /* 256 is the maximum length of s */
so_far += snprintf(s + so_far, 256 - so_far, "%lf", tempValue);

沿着这些路线的东西。通过这种方式,您可以一个接一个地创建字符串,将每个元素附加到前一个元素,而不是尝试一次创建所有元素。

关于c - vsprintf,如何在 Linux 上将 void** 转换为 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691189/

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