为什么_vsnprintf在Windows崩溃

时间:2011-05-10 03:42:19

标签: printf

_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); (output.c)

我不知道为什么。

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

2 个答案:

答案 0 :(得分:0)

这是使用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
}

答案 1 :(得分:0)

我不知道这是否有帮助,但请记住,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/