详解sprintf()&sprintf_s()

sprintf

函数功能:把格式化的数据写入某个字符串 

头文件: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;
}



  • 35
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sprintf是一个C语言标准库函数,用于将格式化的数据写入一个字符串中。其函数原型为: ```c int sprintf(char *str, const char *format, ...); ``` 其中,第一个参数是目标字符串的指针,需要足够大以容纳写入的数据;第二个参数是格式化字符串,用于指定写入数据的格式;后面可以跟多个参数,分别代表要写入的数据。 sprintf函数的返回值是写入目标字符串的字符数(不包括字符串末尾的'\0')。 下面是一些使用sprintf的示例: ```c char str[100]; int num = 123; float fnum = 3.14; sprintf(str, "The number is %d and the float number is %.2f", num, fnum); printf("%s\n", str); // 输出:The number is 123 and the float number is 3.14 ``` 在这个示例中,sprintf将数字和浮点数按照指定的格式写入了目标字符串str中。注意,%.2f表示保留两位小数的浮点数格式。 ```c char str[100]; char name[] = "John"; int age = 25; sprintf(str, "My name is %s and I am %d years old", name, age); printf("%s\n", str); // 输出:My name is John and I am 25 years old ``` 在这个示例中,sprintf将字符串和数字按照指定的格式写入了目标字符串str中。 需要注意的是,sprintf函数存在缓冲区溢出的风险,因此在使用时需要保证目标字符串足够大。另外,在格式化字符串中使用参数时,需要保证参数类型与格式化字符串中指定的类型匹配,否则可能会产生不可预期的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值