人们说使用vprintf
代替printf
。但我不能因为我需要使用自己的功能。
那么可以在没有这些v ...函数的情况下链接va_list
个调用吗?如何 ?
char* createString(const char* line, ...)
{
char* result = (char*)malloc(100);
va_list args;
va_start(args, line);
vsprintf(result, line, args);
va_end(args);
return result;
}
void show(const char* line, ...)
{
va_list args;
va_start(args, line);
char* a = createString(line, args);
va_end(args);
AfxMessageBox(a);
free(a);
}
// usage:
show("test %i, %i", 12, 123);
当我尝试这个时,我会显示错误的字符串。而不是12和123,我得到一些指针或东西。
悲伤的解决方案:
char* vCreateString(const char* line, va_list args)
{
char* result = (char*)malloc(100);
vsprintf(result, line, args);
return result;
}
答案 0 :(得分:2)
不,这是不可能的。这就是v
- 版本首先存在的原因,以支持传递va_list
。
您需要createString()
接受va_list
参数。
此外,please don't cast the return value of malloc()
in C,并考虑使用vsnprintf()
来防止缓冲区溢出。