功能使用
1、该函数包含在stdio.h头文件中。
2、功能和我们常用的功能很相似。 函数打印到一个字符串(注意字符串的长度必须足以容纳打印的内容,否则会发生内存溢出),函数将输出打印到屏幕上。 我们的操作中广泛使用函数来将其他数据类型转换为字符串类型。
3、函数格式:
int (char *, const char * [, ,…] );
除了前两个参数是固定的之外,可选参数可以是任意数量。 它是一个字符数组名称; 是一个格式字符串(如:“%3d%6.2f%#x%o”,当%和#一起使用时,在十六进制数前面自动添加0x)。 只要格式字符串可以用在 中,就可以用在 中。 格式字符串是这个函数的本质。
两者都使用格式字符串来指定字符串的格式。 使用一些以“%”开头的格式说明符来占据格式字符串内的位置。 在下面的变量参数列表中提供相应的变量。 最终函数将使用相应位置的变量替换该说明符,产生调用者想要的字符串。
4.可控制精度
字符str[20];
f=14。;
(str,"%6.2f",f);
5.可连接多个数值数据
字符str[20];
int a=20984,b=48090;
(str,"%3d%6d",a,b);
str[]=”20984 48090”
6.多个字符串可以拼接成字符串
字符str[20];
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
(str,"%.3s%.3s",s1,s2);
%mn字符串的输出中,m表示字符串的宽度和所占的列数; n代表实际的字符数。 %mn在浮点数中,m也代表宽度; n 代表小数位数。
7、可以动态指定需要截取的字符数。
字符str[20];
char s1[5]={'A','B','C'};
char s2[5]={'T','Y','x'};
(str,"%.*s%.*s",2,s1,3,s2);
(str, “%*.*f”, 10, 2, 3.);
8. 可以打印出i的地址
字符str[20];
整数我;
(str, “%p”, &i);
上面的语句相当于
(str, “%0*x”, 2 * (void *), &i);
9、返回值是字符数组中的字符数,即字符串的长度。 无需调用 (str) 来查找字符串的长度。
10、使用字符指针指向的字符串来接收打印的内容
例子:
int main()
{
int ddd=666;
char *buffer=NULL;
if((buffer = (char *)malloc(80*sizeof(char)))==NULL)
{
printf("malloc error\n");
}
sprintf(buffer, "The value of ddd = %d", ddd);//The value of ddd = 666
printf("%s\n",buffer);
free(buffer);
buffer=NULL;
return 0;
}
当指针第一次定义时,它并不指向该位置。 它可以指向一个变量然后使用它。 如果你想简单地使用这个指针,那么你需要为这个指针分配一块内存。 如果添加的话需要添加.h
11.想象一下,当你从数据库中取出一条记录,然后想将它们的字段按照一定的规则连接成一个字符串时,可以使用这种方法。 理论上应该效率更高,因为每次调用都需要先找到最后一个字符串结束符'\0的位置。 在上面给出的例子中,我们每次都使用返回值直接记录这个位置。
例子:
void main(void)
{
char buffer[200], s[] = "computer", c = 'l';
int i = 35, j;
float fp = 1.7320534f; //
j = sprintf( buffer, " String: %s\n", s ); //
j += sprintf( buffer + j, " Character: %c\n", c ); //
j += sprintf( buffer + j, " Integer: %d\n", i ); //
j += sprintf( buffer + j, " Real: %f\n", fp );//
printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}
本例将格式控制块中所有定义的数据和字符连接在一起,最终打印出字符串的内容和字符数。
结果如图所示:
12.格式化数字字符串
最常见的应用之一是将整数打印到字符串。 喜欢:
(1) 将整数123打印成字符串,保存在s中。
(s,“%d”,123); //产生“123”
(2) 可以指定宽度,如果左边不足则补空格:
(s, “%8d%8d”, 123, 4567); //产生:“123 4567”
当然,你也可以左对齐:
(s, “%-8d%8d”, 123, 4567); //产生:“123 4567”
(3)也可以以十六进制格式打印:
(s,“%8x”,4567); //小写十六进制,宽度占8位,右对齐
(s,“%-8X”,4568); //大写十六进制,宽度占8个位置,左对齐
这样就很容易得到一个整数的十六进制字符串,但是当我们打印十六进制内容时,我们通常希望采用左边补0的等宽格式。 那么我们应该做什么呢? 很简单,只要在表示宽度的数字前面加一个0就可以了。
(s,“X”,4567); //产生:“”
上面使用“%d”的十进制打印也可以使用这种左边补0的方法。
这里需要注意一个符号扩展问题:例如,如果我们想打印短整数
(4) (short)-1 的内存十六进制表示。 在Win32平台上,一个short类型占用2个字节,所以我们自然要使用4个十六进制数来打印它:
短 si = -1;
(s,“X”,si);
”,这是怎么回事?因为是可变参数函数,除了前两个参数外,后面的参数都不是类型安全的,函数没有办法在函数调用之前仅仅通过一个“%X”就知道这些参数" 入栈时,是4字节整数还是2字节短整型?因此采用统一4字节处理方式,导致入栈时参数被符号扩展,扩展为32位。整数-1,打印时4个位置不够,所以把32位整数-1的8个十六进制数字全部打印出来。如果你想看到si的真面目,那么你应该让编译器做0扩展代替符号扩展(扩展时,二进制补码左边为0而不是符号位):
(s,“X”,(短)si);
就是这样。 或者:
短 si = -1;
(s,“X”,si);
您还可以使用“%o”以八进制格式打印整数字符串。 注意,八进制和十六进制都不会打印出负数,它们都是无符号的。 事实上,变量的内部编码是直接用十六进制或八进制表示的。
参考: