C语言:sprintf() 用法详解

一、sprintf()简介

1. 函数原型

int sprintf(char *string, char *format [,argument,...]);

2. 参数

  • string – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format – 格式化字符串,结构与printf函数一样为:%[flags] [width] [.prec] [length] type
  • [argument]… – 参数表,根据不同的 format 字符串,有不同的参数表。

3. 功能

把格式化的数据写入某个字符串缓冲区。

4. 头文件

#include<stdio.h>

5. 返回值

如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5。

二、sprintf() 用法

sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中。

1. 把整数打印到字符串中

具体代码如下:

#include <stdio.h>

int main(void)
{
    
    
	char sdata[200]={
    
    0};
	
	sprintf(sdata,"%d",520);
	printf("%s\n",sdata);
	
	sprintf(sdata, "%-6d%6d", 520,5231); 		//默认右对齐 
	printf("%s\n",sdata);
	
 	sprintf(sdata, "0x%06x 0X%06X", 520,5231);	//小写和大写16进制 
 	printf("%s\n",sdata);
 	
	return 0;
}

运行结果如下:

520
520     5231
0x00146f 0X00146F

2. 控制浮点数打印格式

具体代码如下:

#include <stdio.h>

int main(void)
{
    
    
	char sdata[200]={
    
    0};
	
 	sprintf(sdata, "%f", 3.1415926); 			//%f默认保留小数点后6 位
 	printf("%s\n",sdata);
 	
 	sprintf(sdata, "%8.3f", 3.1415626);			//指定宽度,不足的左边补空格:
 	printf("%s\n",sdata);
 	
 	sprintf(sdata, "%.3f", 3.1415626);			//不指定总宽度
 	printf("%s\n",sdata);
 	
	return 0;
}

运行结果如下:

3.141593
   3.142
3.142

3. 连接字符串

sprintf() 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串。sprintf() 能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。
具体代码如下:

#include <stdio.h>

int main(void)
{
    
    
	char sdata[200]={
    
    0};
	char* who = "I";
	int m = 100;
	
	sprintf(sdata, "%s love %d 元.", who,m);//简单的字符串拼接 
	printf("%s\n",sdata);
 	
	return 0;
}

运行结果如下:

I love 100.

4. 打印地址信息

具体代码如下:

#include <stdio.h>

int main(void)
{
    
    
	char sdata[200]={
    
    0};
	int n=0;
	
	sprintf(sdata,"%u",&n);//十进制地址 
	printf("%s\n",sdata);
	
	sprintf(sdata,"%08X",&n);//十六进制地址 
	printf("%s\n",sdata);	
 
 	sprintf(sdata,"%p",&n);	// 专用打印地址 
	printf("%s\n",sdata);	
	return 0;
}

运行结果如下:

6356556
0060FE4C
0060FE4C

5. 利用sprintf 的返回值

sprintf() 返回了本次函数调用最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf 调用结束以后,你无须再调用一次strlen 便已经知道了结果字符串的长度。
具体代码如下:

#include <stdio.h>

int main(void)
{
    
    
	char sdata[200]={
    
    0};
	int len=0;
	
	len=sprintf(sdata,"%s!","I love you");
	printf("len=%d\ndata=%s\n",len,sdata);
	
	len+=sprintf(sdata+len,"%d",1314);
	printf("len=%d\ndata=%s\n",len,sdata);
	
	len+=sprintf(sdata+len,"--%p。",&len);
	printf("len=%d\ndata=%s\n",len,sdata);
	return 0;
}

运行结果如下:

len=11
data=I love you!
len=15
data=I love you!1314
len=27
data=I love you!1314--0060FE4C。

三、使用sprintf() 常见问题

sprintf() 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况。

  • 缓存区溢出: 第一个参数分配的长度太短了,尽量大一点,打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
  • 忘记第一个参数: 低级得不能再低级问题,用printf 用得太惯了。
  • 变参对应出问题: 通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位。

猜你喜欢

转载自blog.csdn.net/MQ0522/article/details/111028283