sprintf, snprintf, vsnprintf 的使用方法,以及它们之间的区别

##sprintf, snprintf, vsnprintf 的使用

一,sprintf函数

在需要整理、格式化字符串时,sprintf就大显身手了。

函数原型:

int sprintf(char *string, char *format [,argument,...]);
  • string:指向字符数组的指针,该数组存储了C字符串。

  • format:格式化的字符串

  • argument:根据语法格式替换format中%标签

  • 返回值:格式化字符转的实际长度

#include <iostream>
using namespace std;
#include <string>

int main(int argc, char *argv[])
{
    double tempData = 17.67, humiData = 28.675;
    char buffer[40] = {0};
    int num = sprintf(buffer, "temperature: %lf; humidity:%lf\r\n", tempData, humiData);
    cout << "num: " << num << endl;
    cout << buffer << endl;

    return 0;
}
控制台输出:
num: 44
temperature: 17.670000; humidity:28.675000
二,snprintf函数

函数原型:

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

两点注意:

(1) 如果格式化后的字符串长度 < size,则将格式化的字符串全部复制到str中,并给其后添加一个字符串结束符(‘\0’);

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

#include <iostream>
using namespace std;
#include <string>

int main(int argc, char *argv[])
{
    double tempData = 17.67, humiData = 28.675;
    char buffer[40] = {0};
    int num = snprintf(buffer, 5+1, "temperature: %lf; humidity:%lf\r\n", tempData, humiData);
    cout << "num: " << num << endl;
    cout << buffer << endl;

    return 0;
}
控制台输出:
num: 44
tempe 
三,sprintf函数 与 snprintf函数的区别

虽然sprintf和snprintf函数都是用于格式化字符串的,但是它们还是会有区别

1.返回值的含义不同

sprintf函数返回的是实际输出到字符串缓冲中的字符个数
snprintf函数的返回值参考 二,snprintf函数

2.安全性不同

sprintf可能导致缓冲区溢出使得程序崩溃,而且bug不易查找
snprintf通过提供缓冲区的可用大小传入参数来保证缓冲区的不溢出,如果超出缓冲区大小则进行截断。

直接看实例会更容易理解

在这里插入图片描述

由于buffer的实际长度44大于给出的40,导致buffer缓冲区溢出

在这里插入图片描述

buffer的实际长度44,但我只往buffer里面存6个字符,给出的40足够了,因此snprintf更安全

四,vsnprintf函数

vsnprintf函数:C标准库函数-<starg.h> c++中<stdarg.h>

函数原型:

int vsnprintf(char *s, size_t n, const char *format, va_list arg)

功能:将格式化的可变参数列表写入n大小的缓冲区,如果在printf上使用格式,则使用相同的文本组成字符串,如果使用arg标识的变量则将参数列表中的元素作为字符串存储在char型指针s中。

  • 参数
    s:指向存储结果C字符串的缓冲区的指针。
    n:要转换的字符的长度(bytes)
    formate:可变参数
    arg:申请参数列表的变量,标识使用va_start初始化的变量参数列表的值。
  • 返回值
    如果n值足够大,则会写入字符数,但是不包括’\0’的终止符。如果发生编码错误则返回值小于0。
    注:只有返回值是非负且小于n时,字符串才完全被写入。
#include <stdio.h>
#include <stdarg.h>

#define MAXLEN 20

int test_log(char* format, ...)
{
    char str_tmp[MAXLEN];
    int i=0,j=0;
    va_list arg;                           
    va_start (arg, format);                 
    i=vsnprintf(str_tmp, MAXLEN, format, arg);  
    va_end(arg);                            

    printf("%s", str_tmp); 
    return i;
}

void main()
{   
    int i=test_log("This is vsprintf test:%s%d\n","string",1024);    
}
控制台输出:
This is vsprintf test:string1024
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值