关于printf的几个C语言库函数

一、_vsnprintf,c语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。

函数原型: int vsnprintf(char* str,size_t size,const char* format,va_list ap);

参数说明: char* str[out] ,把生成的格式化的字符串放入此变量。

                      size_t [in] ,str可接受的最大字节数,防止产生数组越界。

                      const char* format[in],指定输出格式的字符串,他决定了你需要提供的可变参数的类型、个数和顺序。

                      va_list ap[in],va_list变量,va:Variable-argument:可变参数。

功能: 将可变参数格式化到一个字符数组。对比与vsprintf,增加了size限制,防止内存溢出。

但是格式化完成后没有加字符串结束符\0,所以要根据函数返回值,然后给字符串加字符结束符。

具体用法:需要先建立指向参数的指针va_list first; 然后就可以格式化,结束后要回收va_end(first);

void Display(const char* format,...)
{
  char szBuffer[255] = {0};
  va_list First;
  va_start(First,format);
  int nLen = _vsnprintf(szBuffer,sizeof(szBuffer),format,First);
  va_end(First);
  if (nLen)
  {
   szBuffer[nLen] = '\0';
  }
  printf("%s\n",szBuffer);
}

int _tmain()
{
  const char* pData1 = "this";
  const char* pData2 = "is";
  const char* pData3 = "test";
  Display("%s %s %s",pData1,pData2,pData3);
  getchar();
  return 0;
}


调用成功返回字符串的大小,失败返回负数。

二、第二个是_snprintf,将可变个参数(。。。)按照format格式化成字符串,然后复制到str中。

int _snprintf(char* Str,size_t size, const char* format,...);

如果格式化后的字符串长度小于size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符。

如果格式化后的字符串长度>=size,则只将其中的(size - 1)个字符复制到str中,并给其后添加一个字符串结束符。返回值为格式化后的字符串长度。

这个函数的可操作性就比较强。

若成功则返回欲写入的字符串长度,若出错则返回负值。

char szBuffer[1024] = {0};

SYSTEMTIME cTime;
::GetLocalTime(&cTime);
int nLen = _snprintf(szBuffer,sizeof(szBuffer),"%.4d %.2d %.2d ---%.2d:%.2d:%.2d\n",
                   cTime.wYear,cTime.wMonth,cTime.wDay,cTime.wHour,cTime.wMinute,cTime.wSecond);

if (nLen)
{
   printf("%s\n",szBuffer);
}

 

这个函数还是比较省心的。暂时就先用这两个函数。

你可能感兴趣的:(关于printf的几个C语言库函数)