函数sscanf()用法

转载 2011年01月14日 16:45:00

     printf()或者sprintf()一定是任何一个C程序员最常见到的函数,与sprintf的作用相反,sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能.

     sscanf的原型很简单,定义如下:
          #include <stdio.h>
          int sscanf(const char *str, const char *format, ...);

     str:待解析的字符串
     format:字符串格式描述,其后是一序列数目不定的指针参数,存储解析后的数据

例1
     int year, month, day;
     int converted = sscanf("20080808", "%04d%02d%02d", &year, &month, &day);
     printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);
输出结果:
     converted=3, year=2008, month=8, day=8
     "%04d%02d%02d"是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐.例子返回结果等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的
字符串以及其转换格式,如果我们把例子中的格式改为"%04d%02d",那么sscanf将只返回2,day的数值不会被sscanf更改.

例2
     double longitude, latitude;
     int converted = sscanf("113.123456789 31.123456789", "%lf %lf", &longitude, &latitude);
     printf("converted=%d, longitude=%.9lf, latitude=%lf/n", converted, longitude, latitude);
输出结果:
     converted=2, longitude=113.123456789, latitude=31.123457
     sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。

例3
     char str[32] = "";
     sscanf("123456abcdedf", "%31[0-9]", str);
     printf("str=%s/n", str);
输出结果:
     str=123456
    上面的格式中,[0-9]表示这是一个仅包含0-9这几个字符的字符串,前面使用数字31修饰词表示这个字符串缓冲区的最大长度(这也是sscanf最为人诟病的地方,很容易出现缓冲区溢出错误,实际上sscanf是可以避免出现缓冲区溢出的,只要在书写任何字符串解析的格式时,注意加上其缓冲区尺寸的限制).
  
例4:修饰符[] 
     char str[32] = "";
     sscanf("123456abcdedf", "%31[0-9a-z]", str);
     printf("str=%s/n", str);
输出结果:
     str=123456abcdedf
     在格式[]中增加了a-z的描述.

例5:修饰符[]
     char str[32] = "";
     sscanf("123456abcdedf", "%31[^a-z]", str);
     printf("str=%s/n", str);
输出结果:
     str=123456
     在[]中增加^表示相反的意思,上面的[^a-z]表示一个不包含任何a-z之间的字符串。

例6:修饰符*和[]
     char str[32] = "";
     int ret = sscanf("123456abcdedf", "%*[0-9]%31[a-z]", str);
     printf("ret=%d, str=%s/n",ret, str);
输出结果:
     ret=1, str=abcdedf
     加上*修饰表示一个被忽略的数据,同时也不需要为它准备空间存放解析结果.如上面的例子中,我们就只使用了str一个参数存放%31[a-z]的解析结果,而sscanf也只返回1,表示只解析了一个数据.

例7:修饰符*和[]

     char str1[32] = "";
     char str2[32] = "";
     char str3[32] = "";
     char str4[32] = "";
     int ret = sscanf("111abc222edf333ghi444qwer", "%[0-9]%*[a-z]%[0-9]%*[a-z]%[0-9]%*[a-z]%[0-9]%*[a-z]", str1, str2, str3, str4);
     printf("ret=%d, str1=%s, str2=%s, str3=%s, str4=%s/n",ret, str1, str2, str3, str4);

输出结果:

     ret=4, str1=111, str2=222, str3=333, str4=444

attention】下面是format的一些参考资料
     转换类型:
%d   整数,需要一个类型为int*的的参数存放转换结果.
%i    整数,如果字符串以0x或者0X开头,则按16进制进行转换,如果以0开头,则按8进制进行转换,否则按10进制转换,需要一个类型为int*的的参数存放转换结果.
%o   无符号的8进制数,需要一个类型为unsigned int*的参数存放转换结果.
%u   无符号的整数,需要一个类型为unsigned int*的参数存放转换结果.
%x   无符号的16进制数,需要一个类型为unsigned int*的参数存放转换结果.
%X   等同于%x.
%f     浮点数,需要一个类型为float*的参数存放转换结果.
%c    单个字符,需要一个类型为char*的参数存放转换结果.
%s    以空格或者换行符结尾的字符串,需要一个类型为char*的参数存放转换结果.
%[]   仅包含在[]中的字符的字符串,如[0-9]表示一个全部是数字的字符串,[a-z]表示一个全部为小写字母的字符串,需要一个类型为char*的参数存放转换结果.
%[^] 与上面相反,[^之后,]之前的所有字符都作为字符串结束标志,如[^0-9]表示一个不包含任何0-9的字符串,需要一个类型为char*的参数存放转换结果.

attention】转换类型修饰符
*     忽略标志,如%*d表示忽略一个整数,%*s表示忽略一个字符串
h     short修饰符,如%hd表示这是一个short int的整数
l      long修饰符,如%ld表示这是一个long int的整数, %lf表示这是一个double的浮点数(%f表示一个float的浮点数)
L     <GCC> long long修饰符,如%Ld表示这是一个64位字节的整数, %Lf表示这是一个long double的浮点数
I64  <VisualC++> __int64修饰符,如%I64d表示这是一个64位字节的整数

 

相关文章推荐

Linux C语言中sscanf 的详细用法

sscanf() - 从一个字符串中读进与指定格式相符的数据. [cpp] view plaincopyprint? 函数原型:    Int  sscanf( string ...

sscanf 其实很强大

最近在做日志分析,linux C 的开发环境,在对每行日志进行处理的时候,手下一个小伙用的是逐字节拆分成字段。 刚开始没注意,后来每天10几G的日志上来后,发现除了速度特别慢以外,还经常出问题,遇到错...

驱动之helloworld模块

初学Android底层驱动和初学C一样都是从helloworld模块开始 首先在目录下面新建一个hello.c的文件,文件内容如下所示: 1、源程序 // 申明头文件 #include #...

C语言sscanf函数的总结

在处理字符串的程序当中,经常会分析字符串,从一大长串的字符串截取我们需要的数据,这如果通过自己手写函数来分析,虽然可以,但当你知道sscanf的功能,那就自己写函数分析就显得多此一举。 这些函数的使...
  • gzshun
  • gzshun
  • 2011-12-18 16:10
  • 39179

C++实现输入一个整数,将各位数字反转后输出

假期在家真的是非常堕落啊,每天一起床半天就没有了,吃完饭(也不知道叫什么饭,早午饭,嘿嘿),虽然也有学习的心,但效率十分低下,因为答应别人要帮别人编一个串口通信的上位机小软件,我打算用vc++,但我没...

关于sscanf函数的各种详细用法

看书的时候碰到sscanf函数,就上网查了很多资料,并加以自己的整理,希望对大家有所帮助。 (因为参考的博客太多太散,就不一一注明,望大神们见谅)          sscanf()  :...

C语言实现日志功能

原文链接: http://hi.baidu.com/huifeng00/item/56e15e56a7a305c89e266793

sscanf 函数使用

sscanf 编辑 sscanf() - 从一个字符串中读进与指定格式相符的数据。 swscanf()- 用于处理宽字符字符串,和sscanf功能相同。 外文名sscanf类    别数据输入 ...

C语言之函数sscanf()的用法

名称 函数原型: int sscanf( const char *, const char *, ...); int sscanf(const char *buffer,const ch...

利用strstr和sscanf解析GPS信息

考察C程序员是否合格的一个重要标准就是看他操作字符串的能力,一个合格的C程序员应该可以熟练的对字符串进行拆分、组合、格式转换以及搜索定位,从一堆数据中提取出有效信息。 比如说我们要做一个GPS导航的...
  • sdvch
  • sdvch
  • 2015-07-21 23:11
  • 1002
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)