theme: juejin
highlight: school-book
1.前言
当需要在控制台打印字符串的时候,会用到printf函数,printf会将格式化后的字符串打印在控制台上,如果需要将数字或者其他数据格式化成字符串保存到一个字符串变量中,会调用另一个函数sprintf
。
2.语法
函数声明为:
int sprintf(char *string, char *format [,argument,...]);
- string:这是一个指向字符数组的指针,用来存储c字符串
- format:需要格式化的字符串,它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier
- argument:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
- 返回值:如果成功,则返回写入的字符总数,失败了则返回负数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5
需要注意的点:
format指向的字符串从string[0]
的位置依次覆盖,当format指向的字符串比string小时,string数组中未被覆盖的值将保持,当format指向的字符串比string大时,会报内存错误
例子:
2.1 format指向的字符串比string小
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
char string[5] = {
'I','L','O','V','E'};
/* Write C code in this online editor and run it. */
sprintf(string, "H%s","I");
for (i = 0; i < 5; i++)
{
printf("string[%d]=%c\n",i,string[i]);
}
return 0;
}
输出结果:
string[0]=H
string[1]=I
string[2]=
string[3]=V
string[4]=E
string[2]=
打印为空是因为格式化字符串之后会自动在字符串后面添加\0
,所以我们在使用sprintf函数之前,一定要对string进行memset操作,保证目标字符串被清除干净
memset(string,0,sizeof(char) * 5)
2.1 format指向的字符串比string大
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
int main()
{
char string[5] = {
0 };
memset(string, 0, sizeof(char) * 5);
/* Write C code in this online editor and run it. */
sprintf(string, "Hello, World!%s \n","who i am");
return 0;
}
结果:在VS2019下报错
Run-Time Check Failure #2 - Stack around the variable 'string' was corrupted.
加#pragma warning(disable:4996)
的原因是允许IDE使用这种容易产生漏洞的旧函数
3.具体示例
3.1 格式化整数
将整数打印成字符串保存在string中
sprintf(string, "%d",123);
指定宽度,设置左右对齐方式
"%m%d":m为正值,右边对齐,左边不足的空格代替
m为负值,左边对齐,右边不足的以空格代替
举例:
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
char string[17];//注意加上`\0`
/* Write C code in this online editor and run it. */
sprintf(string, "%8d%8d",456,789);
printf("string=%s\n", string);
sprintf(string, "%-8d%-8d", 456, 789);
printf("string=%s", string);
return 0;
}
结果:
3.2 打印浮点数
使用格式符%f时,默认保持小数点后面6位数,如
sprintf(string, "%f",3.1415626);//3.141593
控制打印的浮点数的宽度和小数位数,格式位%a.bf
其中a表示打印宽度
,b表示小数位数
,如:
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
char string[17];//注意加上`\0`
/* Write C code in this online editor and run it. */
sprintf(string, "%f",3.1415926);
printf("string=%s\n", string);
sprintf(string, "%5.3f", 3.1415926);
printf("string=%s\n", string);
sprintf(string, "%-5.3f", 3.1415926);
printf("string=%s\n", string);
sprintf(string, "%.3f", 3.1415926);
printf("string=%s\n", string);
return 0;
}
结果:
string=3.141593
string=3.142
string=3.142
string=3.14
3.3 字符串连接
使用sprintf可以一次性连接多个字符串,如·
#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
int main()
{
int i = 0;
char string[17];//注意加上`\0`
char* name = "Tom";
char* base = "Asia";
/* Write C code in this online editor and run it. */
sprintf(string,"%s live in %s",name,base);
printf("%s", string);
return 0;
}
结果:
Tom live in Asia