2011-05-10 87 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/