封装snprintf

715 阅读1分钟

snprintf() 函数的声明:

int snprintf ( char * str, size_t size, const char * format, ... );

参数:

  • str为要写入的目标字符串;
  • size为能写入的字符的最大数目,超过n会被截断,包括’\0’符,所以能最大写入的其实是size-1个字符;
  • format为格式化字符串,使用方式与printf()函数相同;
  • ... 为变量,可为多个,取决于format。

返回值:

  • 如果格式化后的字符串长度小于等于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0;
  • 如果格式化后的字符串长度大于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。

注意:

  • 当要写入的长度大于str的长度时,返回值不是str的长度,而是4个参数的长度(取决于format)。

因此我们在使用该函数的时候可以对其先进行封装


int bcc_snprintf(char *dst, int size, char *fmt, ...)
{
    int len;
    if (dst ==  NULL){
      return -1;
    }

    if (size <= 0){ //用来判断buf长度是否已经用完
      printf("buffer_len not enough:%d\n",size);
      return -1;
    }
    va_list argp;
    va_start(argp, fmt);
    //以下函数功能与snprintf相对应,只是在函数调用时,把上面的...对应的一个个变量用va_list调用所替代。在函数调用前argp要通过va_start()宏来动态获取。
    len = vsnprintf(dst, size, fmt, argp);
    if (len > 0 ){
      len = len > size - 1 ? size - 1 : len;
    }else{
      return -1;
    }
    va_end(argp);

    return len;
}

其中,可变参数列表va_list宏说明:

  • void va_start(va_list ap, last);
  • void va_end(va_list ap);

va_start与va_end是成对被调用的, 开始的时候被调用va_start,获得各输出变量地址; 结束的时候被调用va_end,释放相应的资源