C++ - 移植 Linux 代码 - _vscprintf返回错误数量的参数
C++ - porting linux code - _vscprintf returns wrong number of arguments
不久前,我在linux下编写了一个记录器类,我尝试将其移植到Windows(Visual Studio)下,但它一直崩溃
首先我不得不使用vsprintf的vsprintf_s,因为comiler拒绝了它
但我找到的唯一例子似乎不起作用
"len"内容错误的值而不是实际数量的参数
这是我调用函数的方式:
Logger::print("Rock and roll");
或
Logger::print("%4.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2fn", 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("%sn",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 解决方案:
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);
值得注意的是:在调试器中运行原始代码将导致缓冲区太小的异常,调试器将轻松捕获该异常。调试器是晚餐。
这里是工作代码
void Logger::print(const std::string fmt, ...)
{
va_list args;
int len;
char * buffer;
va_start(args, fmt);
len = _vscprintf(fmt.c_str(), args)+1;
buffer = (char*)malloc(len * sizeof(char));
vsprintf_s(buffer, len, fmt.c_str(), args);
va_end(args);
Logger::file << buffer;
free(buffer);
}
相关文章:
- 如何通过参数抛出错误消息
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 为什么 std::绑定错误参数可以成功?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- g++ 为 transform() 的参数生成错误
- 如何在C++中使用 Void 而不会收到有关参数的错误
- 错误:参数中无效地使用了无效表达式
- xgboost 构建错误:参数包未扩展为"..":
- src/caffe/parallel.cpp:70:1:错误:“参数”未命名类型
- OpenCV 错误:ERClassifierNM1 中的错误参数
- 为什么显示错误:参数太少而无法正常工作
- 算法错误:参数无法从对中掩盖 1
- 类模板方法的专用化,类型名称是类模板 - 错误:参数处的类型/值不匹配
- C++连接函数错误-参数无效
- 错误:参数无效
- (自适应)opencv中的阈值错误(cvarrToMat中的错误参数(未知数组类型))
- OpenCV错误:cvGetSize中的错误参数(数组应该是CvMat或IplImage)
- OpenCV 2.2:未知函数中的错误参数,文件.. .ocv OpenCV modulescoresr
- 错误:参数声明的存储类说明符无效