sprintf函数的用法_sprintf函数的实例

sprintf函数的用法_sprintf函数的实例,第1张

  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’结束的字符串:

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第2张

  运行结果:

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第3张

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

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第4张

  运行结果:

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第5张

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

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第6张

  (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的末尾!否则会读取非法内存!),这样就可以生成一个具有一定规则的字符串了~写个例子:

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第7张

  运行结果:

  sprintf函数的用法_sprintf函数的实例,sprintf函数的用法_sprintf函数的实例,第8张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2474948.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-04
下一篇 2022-08-04

发表评论

登录后才能评论

评论列表(0条)

保存