gpt4 book ai didi

c++ - 具有可变参数的 C 函数崩溃

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

我写了一个函数来帮助我调试一个项目:

    static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %s\n"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), "%s", szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}

这个函数的一个例子:

    outputDebug(__LINE__, "AdapterInit(%s)", "Test");

格式字符串 AdapterInit(%s) 之后的所有内容都是可选的,我单步执行了该函数,它毫无问题地构造了 szPrefix,例如,这将包含类似的东西; 2018 年 4 月 18 日 07:33:07 01492 适配器(%s)

下一行 vsprintf 导致异常:

    Unhandled exception at 0x0781e9ee (msvcr90d.dll) in ....

我看不出我做错了什么,我该如何解决?

[编辑] 问题出在开始 vsprintf 的行中,删除不必要的 %s 解决了问题。

工作解决方案:

    static void outputDebug(unsigned uintLineNo, const char* cpszFormat, ...) {
char szPrefix[80], szOut[256];
va_list ap;
va_start(ap, cpszFormat);
sprintf_s(szPrefix, sizeof(szPrefix), "%s %s %05ld %s\n"
, __DATE__, __TIME__, uintLineNo, cpszFormat);
vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);
va_end(ap);
OutputDebugString(szOut);
}

最佳答案

如果我收集正确,您将构建 szPrefix 作为新的格式字符串(通过将 cpszFormat 插入其中,添加前缀)。所以对 vsprintf_s 的调用应该使用 that,而不是 %s。即

vsprintf_s(szOut, sizeof(szOut), szPrefix, ap);   

您为 szPrefix 选择的大小(即 80)也相当乐观。可能值得将其提高一两个档次。

关于c++ - 具有可变参数的 C 函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49892912/

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