sprintf函数的用法,sprintf函数的用法

 sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。

 sprintf函数的用法

 说明1:该函数包含在stdio.h的头文件中,使用时需要加入:#include 《stdio.h》

  说明2:sprintf与printf函数的区别:二者功能相似,但是sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。

  说明3:sprintf函数的格式:int sprintf( char *buffer, const char *format [, argument,。。。] );

 除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串(像:“=%6.2f%#x%o”,%与#合用时,自动在十六进制数前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。其中的格式化字符串是此函数的精华。

 说明4:可以控制精度

 char str[20];

 double f=14.309948;

 sprintf(str,“%6.2f”,f);

  说明5:可以将多个数值数据连接起来。

 char str[20];

 int a=20984,b=48090;

 sprintf(str,“=m”,a,b);

 str[]=“20984 48090”

 说明6:可以将多个字符串连接成字符串

 char str[20];

 char s1={‘A’,‘B’,‘C’};

 char s2={‘T’,‘Y’,‘x’};

 sprintf(str,“%.3s%.3s”,s1,s2);

 %m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度;n表示小数的位数。

 说明7:可以动态指定,需要截取的字符数

 char s1={‘A’,‘B’,‘C’};

 char s2={‘T’,‘Y’,‘x’};

 sprintf(str,“%.*s%.*s”,2,s1,3,s2);

 sprintf(s, “%*.*f”, 10, 2, 3.1415926);

  说明8:可以打印出i的地址:sprintf(s, “%p”, &i);相当于sprintf(s, “%0*x”, 2 * sizeof(void *), &i);

 说明9:sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。

 sprintf函数的实例

 通过两个实例一起再来了解sprintf函数。

 (a)连接以‘\0’结束的字符串:

 

 运行结果:

 

 (b)连接结尾没有‘\0’的字符数组或字符串缓冲区:

 

 运行结果:

 

 如果第二种情况的程序中,sprintf的format部分为“%4s%4s”或“%s%s”,运行结果均为:

 

 (c)如果我们想动态获取要处理的字符缓冲区长度,则将上面sprintf改为:sprintf(buffer, “%.*s%.*s”, sizeof(a), a, sizeof(b), b);即可~

 (3)利用sprintf中的返回值:在”AOV网络和拓扑(二)——实现“篇中,有这样一行程序:pos += sprintf(output+pos, “%d ”, j+1); 它的作用是什么呢?

 因为sprintf函数的返回值为output+pos所指向字符串的长度,所以对于pos来说,相当于执行了一次pos+=sizeof(output+pos),如果这条语句放在一个循环里,则第二次执行sprintf时output+pos随即指向了当前缓冲区的末尾(注意不是output的末尾!否则会读取非法内存!),这样就可以生成一个具有一定规则的字符串了~写个例子:

 

 运行结果:

 

 pos每次增加2,因为每次buf字符串后面都要加上两个字符j和‘-’。

相关推荐

相关文章