2011-05-10 173 views
0

_vsnprintf何时会崩溃?为什么_vsnprintf在windows崩溃

我用这样的:

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,它应该返回一个值,不管它是否正常。

+1

发表你的整个代码,我们不是通灵。什么是'szFormatString'和'argptr'? – 2011-05-10 04:02:20

+0

首先检查:'szLine'实际上是指向MAX_LENGTH_STRING字符缓冲区的指针吗? – 2011-05-10 04:05:29

+0

你是如何创建va_list函数参数的? – 2011-05-10 07:43:11

回答

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 
} 
+0

它似乎与我的代码一样,但vsnprintf有时会崩溃... – Jianzhong 2011-05-10 10:01:40

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/