详解sprintf()&sprintf_s()
来源:互联网 发布:淘宝店装修步骤 编辑:程序博客网 时间:2024/05/29 18:11
函数功能:把格式化的数据写入某个字符串
头文件:stdio.h
函数原型:int sprintf( char *buffer, const char *format [, argument] … );
返回值:字符串长度(strlen)
在将各种类型的数据构造成字符串时,sprintf 的功能很强大。sprintf 与printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多.。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
输出格式控制:
%% 印出百分比符号,不转换。
%c 整数转成对应的 ASCII 字元。
%d 整数转成十进位。
%f 倍精确度数字转成浮点数。
%o 整数转成八进位。
%s 整数转成字符串。
%x 整数转成小写十六进位。
%X 整数转成大写十六进位。
示例:
#include<iostream>#include<cstdio>using namespace std;int main(){char str[20];char *s1="hello"; char *s2="world";sprintf(str,"%s %s",s1,s2);printf("%s\n",str);char str_1[20];int n,a=3,b=5;n=sprintf(str_1,"%d + %d = %d",a,b,a+b);//返回字符个数printf("[%s] :字符数为%d\n",str_1,n);char str_2[20];sprintf(str_2,"%x %o abcdefg",123,123);//控制输出字符串的转换为相应的进制数 //分别转换为十六进制和八进制puts(str_2);sprintf(str_2,"%X %o",123,123);//给数组赋新值puts(str_2);//仅输出 "7B 173",说明sprintf向字符串str_2写入字符后,尾部自动加了'\0'cout<<str_2[8]<<endl;//输出为b 即str_2[7]='a' str_2[8]='b' ... 说明sprintf()知识重新修改了前面的字符。system("pause");return 0;}
但是在MSDN中,有这样一段话:
使用 sprintf,无法限制编写的字符数,这意味着,使用 sprintf 的代码易出现缓冲区溢出。
使用sprintf_s更加安全一点。
sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险。在使用VS2008时如果你使用了sprintf函数,那么编译器会发出警告:使用sprintf存在风险,建议使用sprintf_s。这个安全版本的原型是:
int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format [,argument] ... );
#include<iostream>#include<cstdio>using namespace std;int main(){char str[20];char *s1="hello"; char *s2="world";sprintf_s(str,sizeof(str),"%s %s",s1,s2);//sizeof(str)的大小必须大于等于待写入字符串的大小加一,否则会出错。printf("%s\n",str);char str_1[20];int n,a=3,b=5;n=sprintf_s(str_1,sizeof(str_1),"%d + %d = %d",a,b,a+b);//返回字符个数printf("[%s] :字符数为%d\n",str_1,n);char str_2[20];sprintf_s(str_2,sizeof(str_2),"%x %o abcdefg",123,123);//控制输出字符串的转换为相应的进制数 //分别转换为十六进制和八进制puts(str_2);sprintf_s(str_2,sizeof(str_2),"%X %o",123,123);//给数组赋新值puts(str_2);//仅输出 "7B 173",说明sprintf_s向字符串str_2写入字符后,尾部自动加了'\0'cout<<str_2[8]<<endl;//未输出b,说明sprintf_s是对整个数组重新写入。system("pause");return 0;}
- 详解sprintf()&sprintf_s()
- sprintf 与sprintf_s
- sprintf 与sprintf_s
- sprintf 转 sprintf_s
- sprintf 用法(sprintf_s)
- C++ sprintf sprintf_s
- sprintf 用法(sprintf_s)
- sprintf 转 sprintf_s
- sprintf 和sprintf_s比较
- sprintf sprintf_s ... 格式化字符串 统一之路?
- 字符串函数sprintf / sprintf_s的陷阱
- C++中sprintf_s与sprintf的不同
- sprintf,sprintf_s,_snprintf和_snprintf_s之间的区别
- 关于fputc、fgetc、printf、sprintf、sprintf_s以及fprintf
- sprintf 详解
- sprintf详解
- sprintf详解
- sprintf详解
- GCC如何编译内嵌汇编代码
- 【亚马逊AWS】IAM机翻
- SNM4J 入门 同步获取数据
- eclipse工程图标上有个红色感叹号
- Linux scp命令
- 详解sprintf()&sprintf_s()
- linux recv\read 和 send/write区别
- PE格式详细讲解10 - 基址重定位
- sql 出现次数最多排序
- 位运算的运用
- SNM4J 异步获取数据
- hdu 1372 bfs
- 分享页面内容的按钮js
- C++中的操作符重载