linux c sscanf和sprintf的简单用法与理解

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;
  /*将字符串包含的信息格式化输出到各个变量中*/
  if((num= sscanf(info,"%9[^|]|%3d|%5[a-zA-Z]|%4f|",name,&age,sex,&tall)) < 4)
  {
    printf("failed,the formatted number:%d\n",num);

  }
  printf("name:%s age:%3d sex: %s tall: %.2f",name,age,sex,tall);
  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       |1.753|",我想要提取有效信息的时候将man尾部的‘ '字符全部去掉怎么办?
可以这样实现:sscanf(info,"%9[^|]|%3d|%5[a-zA-Z]%*[ ]|%4f|",name,&age,sex,&tall))
在%[a-zA-z]后面加上%*[]这样就能够去掉man后面的若干个空格并且能够正确提取tall的信息.

这些只是关于sscanf和ssprintf浅显的分析 ,希望能够和我一样的初学者一些帮助,当然如果你有什么好的关于sscanf和sprintf的用法也可以和我分享~~



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值