VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1429|回复: 0

[交流] Sscanf与Sprintf区别

[复制链接]
46_avatar_middle
在线会员 发表于 2016-11-1 21:48:16 | 显示全部楼层 |阅读模式
1、int sprintf(char *str,const char *format,.....);
函数说明:根据format来转换并格式化数据,并把结果写入到str所指的字符串数组中。
返回值:成功的话返回str字符串的长度,否则返回-1。
在C中 我们可以用这个函数很灵活的进行一些字符串操作,比如其他数据类型转换成字符串,字符串连接,并且简单易懂。
如:
char a[60] = "bag";
char b[15] = "price";
int price = 66;
/*将b连接到a的后面* /
sprintf(a,"%s%s",a,b);
printf("%s",a);
/*格式化输出*/
sprintf(a,"%s %s:$%d",a,b,price);
printf("%s",a);

输出结果:
jimprice
jim price :$66
轻而易举的实现了两个字符串的连接,但是使用sprintf的时候要考虑到str 参数指向的字符串是否有可能会溢出,如果上面的小例子a[60]改为4的话会造成溢出,无法保证是否会影响到其他方面,如果可以的话我们也可是使用snprintf函数:int snprintf(char *str,size_t n,const char *format,.....);,通过参数n限定字符串的大小(即包含'\0'),如:snprintf(a,60,"%s%s",a,b);

sprintf()函数同样能够将其他数据类型转换成字符串类型:
int a = 45;
char s[3] = "";
/*将a以十进制的方式转换为字符串*/
sprintf(s,"%d",a);
printf("%s",a);
/*将a以16进制的方式转换为字符串*/
sprintf(s,"%x",a);
printf("%s",a);
输出结果:
45
2d
sprintf()还有很多灵活的用法,欢迎大家一起来探讨下。
2、int sscanf(const char *str, const char *format, ......);
函数说明:sscanf()会将参数str的字符串按照参数format的格式进行转换并格式化输出数据。
返回值:成功的话返回参数数目,失败则返回-1,错误原因保存在errno中
sscanf函数可用来从一些按照某种规范或者格式的字符串中提取有效信息,比如:
  char info[] = "jack|19|man|1.753|";
  char name[10] = {'\0'};
  int age = 0;
  char sex[6] = {'\0'};
  float  tall = 0.0;
  int num = 0;
  /*将字符串包含的信息格式化输出到各个变量中*/
&#160; if((num= sscanf(info,"%9[^|]|%3d|%5[a-zA-Z]|%4f|",name,&age,sex,&tall)) < 4)
&#160; {
&#160;&#160;&#160; printf("failed,the formatted number:%d\n",num);
&#160; }
&#160; printf("name:%s age:%3d sex: %s tall: %.2f",name,age,sex,tall);
&#160; return 1;
输出结果:
name:jack age:19 sex: man tall: 1.75
我先简单解释下上面的这个小例子要实现的效果:将从info这个字符串提取各个有效信息出来,有效信息之间用'|'字符分隔开来。
在format参数中我用到了%[^|]这个代表了读取非'|'字符若遇到'|'字符则停止,如果是%9[^|]则代表最多读取9个非'|'字符并把转换给name这个变量,当然如果我们用%[^| ]则代表读取非'|'或' '字符.%3d则代表最多读取的字符串最长能转换为3位的整形变量,%5[a-zA-Z]则代表最多读取5位满足在a-z或A-Z范围内的字符并赋给sex指针,%4f表示字符串转换成长度为4位的浮点数(包含整数部分以及小数点).
当然用法不只那么点,如果是%*[ 1-9]则代表省略1-9范围内的所有数字字符,这就是'*'的作用,再举个例子:
%*[|]省略掉'|'字符直到遇到非'|'为止
我再稍微扩展下上面的小例子,如果info字符串的内容为"jack|19|man&#160;&#160;&#160;&#160;&#160;&#160; |1.753|",我想要提取有效信息的时候将man尾部的‘ '字符全部去掉怎么办?
可以这样实现:sscanf(info,"%9[^|]|%3d|%5[a-zA-Z]%*[ ]|%4f|",name,&age,sex,&tall))
在%[a-zA-z]后面加上%*[]这样就能够去掉man后面的若干个空格并且能够正确提取tall的信息.




上一篇:MFC 简单控件学习(静态文本框,编辑框,按钮)
下一篇:找个项目一起做-总结MFC所学
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-10-15 13:17

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表