【问题标题】:Why _vsnprintf crash at windows为什么 _vsnprintf 在 Windows 上崩溃
【发布时间】:2011-05-10 03:42:19
【问题描述】:

_vsnprintf 什么时候会崩溃?

我是这样使用的:

   void My_Printf(const char *szFormatString, ...)
   {
      va_list my_args;
      va_start(my_args, szFormatString);
      AppendToLog(szFormatString, my_args);
      va_end(my_args);
    }

    static void AppendToLog(const char *szFormatString, va_list argptr)
    {
        char szLine[MAX_LENGTH_STRING] = {0};


      if ((NULL != szFormatString) && (0 != strcmp(szFormatString, ""))) {
        if (strlen(szFormatString) > MAX_LENGTH_STRING) {
          return;
        }

    #ifdef WIN32
       _vsnprintf(szLine, MAX_LENGTH_STRING-1, szFormatString, argptr);
    #endif
    ...
    }

并且 VC 显示它在以下位置被破坏:

_VALIDATE_RETURN( (ch != _T('\0')), EINVAL, -1); (输出.c)

我不知道为什么。

根据MSND,无论是否正常,它都应该返回一个值。

【问题讨论】:

  • 发布您的全部代码,我们不是通灵者。 szFormatStringargptr 是什么?
  • 首先要检查:szLine 是否真的指向一个 MAX_LENGTH_STRING 个字符的缓冲区?
  • 你是如何创建 va_list 函数参数的?

标签: printf


【解决方案1】:

这是使用 vsnprintf 的规范代码:

void Format( const char * fmt, ... ) {
  const int BUFSIZE = 1024;
  char buffer[BUFSIZE];
  va_list valist;
  va_start( valist, fmt );
  vsnprintf( &buf[0], BUFSIZE, fmt, valist );
  va_end( valist );
  // do something with buffer
}

【讨论】:

  • 好像和我的代码一样,但是 vsnprintf 有时会崩溃...
【解决方案2】:

我不知道这是否有帮助,但请记住 vsnprintf(和 _vsnprintf 我猜是因为微软说它们是相同的)在 Windows 和 Unix 上返回不同的值。如果缓冲区溢出,Windows 版本返回 -1,而 Unix 版本返回如果缓冲区足够大,将写入多少个字符。以下是我发现在这方面有用的几个链接:

http://msdn.microsoft.com/en-us/library/1kt27hek(v=vs.80).aspx

http://bytes.com/topic/c/answers/590845-snprintf-return-value

编辑:这是我发现解决此问题的替代版本: http://article.gmane.org/gmane.comp.version-control.git/75280/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2013-04-05
    相关资源
    最近更新 更多