gpt4 book ai didi

C++ - 移植 linux 代码 - _vscprintf 返回错误数量的参数

转载 作者:行者123 更新时间:2023-11-28 04:26:05 32 4
gpt4 key购买 nike

前段时间我在 linux 下写了一个记录器类,我尝试将它移植到 windows (visual studio) 下,但它一直崩溃

首先我不得不使用 vsprintf_s 而不是 vsprintf,因为编译器拒绝了它

但我找到的唯一例子似乎不起作用

“len”内容是错误的值而不是实数的参数

这里是我如何调用我的函数:

Logger::print("Rock and roll");

Logger::print("%4.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f\n", a.x, a.y, b.x, b.y, c.x, c.y, d.x, d.y);

原始 Linux 代码:

void Logger::print(const std::string fmt,...)
{
char formatted_string[2*1024];
strcpy(formatted_string,this->prefix);
strcat(formatted_string," ");

char*strPtr=&formatted_string[0]+strlen(this->prefix)+1;

va_list argptr;
va_start(argptr, fmt );

vsprintf(strPtr,fmt.c_str(), argptr);
va_end(argptr);

printf("%s\n",formatted_string);
}

新窗口代码:

void Logger::print(const std::string fmt, ...)
{
va_list args;
int len;
char * buffer;
va_start(args, fmt);
len = _vscprintf(fmt.c_str(), args); << len contents odd values instead of real number of arguments
va_end(args);
buffer = (char*)malloc(len * sizeof(char));
vsprintf_s(buffer, len, fmt.c_str(), args);
Logger::file << buffer;
free(buffer);
}

问候

最佳答案

您过早地调用了 va_end。解决这个问题,您也没有计算正确的目标大小,因为 _vscprintf 确实包含终止空字符的空间,vsprintf_s 将利用。

您的函数主体应该如下所示,包括删除 malloc 调用以支持适当的 RAII使用 vector 的解决方案:

va_list args;
va_start(args, fmt);

int len = _vscprintf(fmt.c_str(), args);
if (len > 0)
{
std::vector<char> buff(len + 1); // include terminator space
vsprintf_s(&buff[0], buff.size(), fmt.c_str(), args);
Logger::file << buff.data();
}
va_end(args);

值得注意的是:在调试器中运行您的原始代码会导致缓冲区太小异常,调试器会轻松捕获该异常。调试器是正餐。

关于C++ - 移植 linux 代码 - _vscprintf 返回错误数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280372/

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