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

    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,例如,其中包含类似以下内容; Apr 18 2018 07:33:07 01492 Adapter(%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的调用应使用该名称,而不是%s。即

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


您为szPrefix选择的大小(即80)也相当乐观。可能值得增加一两个等级。

10-06 14:58