C++程序员应了解的那些事(102)~ C中snprintf与vsnprintf函数

本文详细介绍了C语言中的snprintf函数,包括函数原型、参数说明、返回值和注意事项。强调了snprintf在不同编译器下可能存在差异,并对比了其与vsnprintf的关系。示例代码展示了snprintf的使用方法,以及如何利用vsnprintf实现snprintf的功能。
摘要由CSDN通过智能技术生成

目录

1、snprintf函数

1.1 函数原型

1.2 参数说明

1.3 返回值

1.4 注意点

2、snprintf与vsnprintf

2.1 va_list获取

2.2 简单的使用vsnprintf函数实现snprintf


       虽然snprintf函数在开发过程中比较常用,但是其中有一些细节性的问题需要注意。因为snprintf函数不是C中的标准函数,不同的编译器可能对该函数的实现不同,本文说明是基于GCC编译器。

1、snprintf函数

1.1 函数原型

snprintf函数的作用是将格式化的数据写入字符串。其函数原型如下:

snprintf(char* buffer, int n, char* format, ...);

1.2 参数说明

  • buffer : 存储格式化字符串的buffer
  • n : 指定格式化字符串的大小,包括\0
  • format : 指定需要格式化字符串的format
  • … : 可变参数

1.3 返回值

        该函数的返回值为其期望字符串的长度,而不是实际存入buffer中的字符串的长度,且不包括\0。

1.4 注意点

       特别注意函数原型中的第二个参数包括\0的大小,而返回值为期望大小且不包括\0。

<示例>
char buffer[256];
//返回值ret = 13,buffer中的内容为123456789
int ret = snprintf(buffer, 10, "%s", "1234567890abc");

memset(buffer, 0x0, sizeof(buffer));
//返回值ret = 3,buffer中的内容为123
ret =snprintf(buffer, 10, "%s", "123");

2、snprintf与vsnprintf

        snprintf和vsnprintf都是C语言printf家族函数的成员。实际上,snprintf和vsnprintf功能完全一样,只是vsnprintf将snprintf中的可变参数换成了av_list类型。如下:

#include <stdio.h>
int printf(const char* format, ...); //输出到标准输出
int fprintf(FILE* stream, const char* format, ...); //输出到文件
int sprintf(char* buffer, const char* format, ...);   //输出到字符串
int snprintf(char* buffer, int n, const char* format, ...);   //输出到字符串
#include <stdarg.h>
int vprintf(const char* format, va_list ap); //输出到标准输出
int vfprintf(FILE* stream, const char* format, va_list ap); //输出到文件
int vsprintf(char* buffer, const char* format, va_list ap);   //输出到字符串
int vsnprintf(char* buffer, int n, const char* format, va_list ap);   //输出到字符串

2.1 va_list获取

可变参数va_list获取方式通过下列函数获取,并且总是成对调用。

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

2.2 简单的使用vsnprintf函数实现snprintf

#include <stdio.h>
#include <stdarg.h>

int my_snprintf(char* buffer, int size, const char* format, ...) {
  va_list ap;
  va_start(ap, format);
  int ret = vsnprintf(buffer, size, format, ap);
  va_end(ap);
  return ret;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值