_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,它应该返回一个值,无论它是否正常。
答案 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/