_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安全,即不会造成缓冲区溢出