队长做上海邀请赛的I题时遇到一个棘手的问题,字符串的处理很麻烦,按传统的gets全部读入的话还要做N多处理,太浪费时间。

回来之后搜了一下sscanf的用法发现可以很好的解决这一类问题,各种百度,转来一篇简单明了通俗易懂的博客。

函数原型:Int sscanf( const char * src, const char * format, ...);
int scanf( const char * format, ...);
这两个函数很相似,只是第一个函数以src作为输入,而第二个函数以标准输入STDIN读取输入;
format 是格式控制字符串,它包含控制字符(如:%d,%i,%s等),空白字符(如:空格、制表符\t、回车换行符\n 或其连续组合)以及非空白字符;
...是一组指针变量,是上述函数用来保存结果值的;
返回值为被成功赋值的指针变量的个数,如果该函数发生错误,则返回EOF(-1)。格式控制format:format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | 空白字符| 非空白符号}
该公式中符号解释如下:
{a|b|c}:表示a,b,c中选一或几个;
[d]:表示可以有d也可以没有d;
* :亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中) ,用法如:view plainprint?
const char sourceStr[] = "hello, world";
char buf[10] = ;
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
cout << buf<< endl;
结果为:world
width:宽度,一般可以忽略,用法如:
view plainprint?
const char sourceStr[] = "hello, world";  char buf[10] = ;  sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符  

cout << buf<< endl;  结果为:hello
{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size;
type:即为控制字符如:d, i, f, s, p, 及集合[ ],(注意%号写在了最前面了,这里不能再加一个%号了。)  需特别注意和说明的控制符是集合%[ ]:view plainprint?
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性  例如取遇到空格为止字符串:
view plainprint?
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
再如:
view plainprint?
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
结果为:12DDWDFF
先将 "iios/"过滤掉,再将到字符<a href="mailto:'@'">'@'</a>为止的一串12DDWDFF 空白字符:' ', '\n', '\t' 等;
非空白字符:即一般字符。格式匹配过程:该函数从源(src 或STDIN)的前面顺序读取一个或一段字符,并将其与顺序取自格式控制字符串中的字符或字符串进行比较匹配:
当遇到一个空白字符时,则不比较而跳过(空格呢?);
当遇到一个非空白字符时,进行比较但不存进指针变量内;
当遇到控制字符时,如果能匹配上,则按照控制字符的意义将从源读取的字符或字符串存入到下一个指针指向地址处;
不能匹配呢?
特别注意的是:
如果控制字符里有width,则会将最多这么多字符串存进下一个指针指向的地址处;
如果是控制符%[],则将源中字符串自当前位置开始到第一个不符合该控制符规定的匹配字符的所有字符存储到下一个指针指向的地址处。常见例子:1. 常见用法。
char buf[512] ;
sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!
printf("%s\n", buf);
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
结果为:123456
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
当输入:
sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s\n",buf);
结果为:123456
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
结果为:12DDWDFF
7、给定一个字符串"hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello, world”, "%*s%s", buf);
printf("%s\n", buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。8.处理2006:03:18 - 2006:04:18(‘-’两边有空格)和2006:03:18-2006:04:18(‘-’两边无空格):
前者:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
后者:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:]-%[0-9,:]", sztime1, sztime2);

转载于:https://www.cnblogs.com/shangyu/p/3848439.html

sscanf的用法(转)相关推荐

  1. 字符串处理函数:sscanf 的用法

    前言: 一直对于一些日期字符串中数字的提取比较头疼,现看到 sscanf 对于字符串中的内容提取较方便,学习记录如下.方便以后查询. sscanf():将 C 语言字符串中数据按 指定的格式 将数据存 ...

  2. ATS中用到的sscanf高级用法说明

    ATS使用sscanf函数主要用来解析配置文件,或者提取出要用到的数据类型的值,比较方便,大家可以使用SourceInsight来搜索sscanf用到的地方,这里补充一些sscanf的知识,方便自己更 ...

  3. [转载].sscanf的用法

    原作者不详. 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mix ...

  4. sscanf高级用法级正则表达式

    sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源. 函数原型: int scanf( const char *format [,argume ...

  5. C语言中 sscanf 的用法

    名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ...

  6. sscanf简单用法

    ssacnf:从一个字符串中读进与指定格式相符的数据(百度百科) 上面只是简单的用法,sscanf还能进行字符和数字的分割. #include<iostream> using namesp ...

  7. C语言函数sscanf()的用法

    转自 http://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原 ...

  8. %d 跟%i 的区别以及scanf和sscanf的用法

    scanf 用%i能够获得8/16进制的值, 比如0011就是9,0x11就是17,当然如果读取到08或者09就会出错了. scanf简介 scanf函数,与printf函数一样,都被定义在stdio ...

  9. sscanf函数用法详解

    sscanf() - 从一个字符串中读进与指定格式相符的数据.  函数原型:  Int sscanf( string str, string fmt, mixed var1, mixed var2 . ...

  10. c++中sscanf的用法

    sscanf 读取格式化的字符串中的数据. swscanf 是 sscanf 的宽字符版本:swscanf 的参数是宽字符串. swscanf不处理 Unicode 全角十六进制或"兼容性区 ...

最新文章

  1. (C++)将整型数组所有成员初始化为0的三种简单方法
  2. c语言 删除小写字母,c++ - 使用C字符串和指针。 删除除小写字母和空格以外的所有字符 - 堆栈内存溢出...
  3. CodeForces Gym-101350M
  4. request body 里丢东西了_26. Scrapy 框架-模拟登录-Request、Response
  5. P6477-[NOI Online #2 提高组]子序列问题【线段树】
  6. Qt creator5.7 OpenCV249之resize函数(含源码下载)
  7. Java开发快速上手
  8. EndNote X7 for Mac破解版
  9. html中划过鼠标滑过上方英文,CSS如何实现鼠标滑过文字出现效果?
  10. Google Chrome 66可以下载啦
  11. kali安装flash插件
  12. laravel5.5 The page has expired due to inactivity. Please refresh and try again.
  13. 临床执业助理医师(综合练习)题库【5】
  14. 小象python培训班_小象最新Python机器学习升级版视频学习教程 共24节精品课
  15. 机器学习算法终极对比:树模型VS神经网络
  16. Spring源码整体分析
  17. 17-MyCat-MyCAT主要作用
  18. unity生成 html5,导出到html5时发生unity项目错误
  19. (附源码)spring boot动力电池数据管理系统 毕业设计 301559
  20. 【小河今学 | JavaScript + JQuery】音乐播放器4-音量调整、单曲循环、全部循环

热门文章

  1. java读取某一行_java 读取指定某一行的文本
  2. C# 滑块长度确认 Scrollbar滑块长度问题 水平垂直滚动条滑块高度宽度问题
  3. c++ stl模糊查找【找到key对应的值,找不到时返回最接近key的两个值】
  4. matlab ctrl c,Matlab:实现CTRL + C的功能,但在代码中
  5. 微博api unexpected response status: 403_抖音直播监控Api:开播查询
  6. 台式电脑备用电源_台式电源哪家稳?华硕 TUF GAMING六年质保,坚如磐石_电脑电源...
  7. 学web前端从哪里开始学起呢-好程序员
  8. 自动化运维之saltstack
  9. RobotFramework特性总结
  10. HBase跨版本数据迁移总结