_snprintf()与sprintf()的区别

_snprintf()

函数功能:将格式化的数据写入字符串。
函数原型:
int _snprintf(
   char *buffer,
   size_t count,
   const char *format [,
   argument] ... 
);

参数:
buffer:输出的存储位置。
count:可存储的最多字符数。
format::窗体控件字符串。
argument:可选参数。

返回值:
将 len 设为格式化数据字符串的长度,不包括终止 null。

如果 len < count,len 个字符将存储在 buffer 中,附加 null 终止符,并返回 len。
如果 len = count,len 个字符将存储在 buffer 中,不附加 null 终止符,并返回 len。
如果 len > count,count 个字符将存储在 buffer 中,不附加 null 终止符,并返回负值。


#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
	//测试_snprintf()
	char str[5];

	int n=_snprintf(str,sizeof(str),"12345%s","lanzhihui");//因为sizeof(str)小于源字符串,所以不会复制'\0'给数组str,

	str[sizeof(str)-1]='\0';//如果缺少此句,输出乱码

	cout<<"source strings :"<<n<<endl;//返回负数
	puts(str);     

	char str_1[50];

	n=_snprintf(str_1,sizeof(str_1),"lanzhihui%s"," is a good boy!");//因为sizeof(str_1)大于源字符串,所以会复制'\0'给数组str_1

	cout<<"source strings :"<<n<<endl;
	puts(str_1);


	//测试sprintf()
	char str_2[5];

	n=sprintf(str_2,"12345%s","lanzhihui");//因为sizeof(str_2)小于源字符串,所以不会复制'\0'给数组str,
                                               //此句导致程序崩溃  
	//str[sizeof(str)-1]='\0';//sprintf始终会在字符串末尾添加结束符

	cout<<"source strings :"<<n<<endl;
	puts(str_2);

	char str_3[50];

	cout<<"source strings :"<<n<<endl;
	n=sprintf(str_3,"lanzhihui%s"," is a good boy!");//因为sizeof(str_3)大于源字符串,所以会复制'\0'给数组str_3

	puts(str_3);

	system("pause");
	return 0;
}

得出的结论:

1. windows上无snprintf,但是有_snprintf可以达到同样的功能,但是细节之处略有不同 
2. 未溢出时,sprintf和snprintf都会在字符串末尾加上'\0'; 
3. 超出缓冲区大小时,_snprintf不会造成溢出,只是不会在缓冲区中添加字符结束符 
4. sprintf始终会在字符串末尾添加结束符,但是存在缓冲区溢出的情况 
5. _snprintf比sprintf安全,即不会造成缓冲区溢出 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值