跨平台vsnpritf和va_list

来源:互联网 发布:妈妈说就算域名在长廊 编辑:程序博客网 时间:2024/04/26 15:48

void FormatOutput(const char* lpszFormat, ...)
{
 va_list argList;
 va_start(argList, lpszFormat);

 int flat = -1;
 int size = 100;
 char* buf = NULL;

 while(flat < 0)
 {
  char* buf = NULL;

  while (flat<0)
  {
   if (buf) {
    delete[] buf;
    buf = NULL;
   }
#ifdef _WIN32
   buf = new char[size + 1];
   if (buf == NULL) {
    va_end(argList);
    return ;
   }
   //如果源串长度超过目的串,则返回-1;没超过的话,拷贝给定长度的字符,不包括'\0'
   flat = _vsnprintf (buf, size, lpszFormat, argList);
   if (flat<0) {
    size += 100;
   }
#else  //在linux上返回其所需长度
   va_list argDest;
   va_copy(argDest, argList);
   size = vsnprintf(NULL, 0, lpszFormat, argDest);
   buf = new char[size + 1];
   if (buf == NULL) {
    va_end(argList);
    return ;
   }

   int tf = vsnprintf(buf, size+1, lpszFormat, argList);
   printf(buf);
   printf("\n");
   if (tf>size) {
    flat = -1;
    size = tf + 1;
   }
   else {
    flat = tf;
   }
#endif
  }
  buf[flat] = 0;

  printf(buf);
  printf("\n");
 }
 va_end(argList);
}

原创粉丝点击