sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:

int scanf( const char *format [,argument]... );
其中的format可以是一个或多个:

{%[*] [width] [{h|l|I64|L}]  type|'_'|'\t'|'\n'|非%符号},

注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

²          width:宽度,一般可以忽略,用法如:

const  char sourceStr[] = "hello, world";

char buf[10] = {0};

sscanf(sourceStr, "%5s", buf);   //%5s,只取5个字符

cout << buf<< endl;

结果为:hello

²          {h|I|I64|L}:参数的size,通常h表示单字节size,I表示2字节 size, L表示4字节size(double例外),l64表示8字节size。

²          type :这就很多了,就是%s,%d之类。

²          特别的:%*[width] [{h|l|I64|L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

const char sourceStr[] = "hello, world";

char  buf[10] = {0};

sscanf(sourceStr, "%*s%s", buf);

//%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

cout << buf<< endl;

结果为:world

²          支持集合操作:

%[a-z]  表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

%[aB']  匹配a、B、'中一员,贪婪性

%[^a]   匹配非a的任意字符,贪婪性

和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z]。

例子:

1. 常见用法。

char buf[512] = {0};

sscanf("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

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:

int a, b, c;

sscanf("2006:03:18", "%d:%d:%d", a, b, c);

9分隔字符串2006:03:18 - 2006:04:18:

char sztime1[16] = "", sztime2[16] = "";

sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

10分隔字符串2006:03:18-2006:04:18:

char sztime1[16] = "", sztime2[16] = "";

sscanf("2006:03:18-2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.

正则表达式的基本用法:

1、“.”为通配符,表示任何一个字符,例如:“a.c”可以匹配“anc”、“abc”、“acc”;

2、“[]”,在[]内可以指定要求匹配的字符,例如:“a[nbc]c”可以匹配“anc”、“abc”、"acc";但不可以匹配“ancc”,a到z可以写成[a-z],0到9可以写成[0-9];

3、数量限定符号,表示匹配次数(或者叫做长度)的符号,包括:

“*”  0次或者多次

“+”  1次或者多次

“?”  0次或者1次

“{n}”    匹配n次,n为整数

“{n,m}”  匹配从n到m之间的某个数的次数;n和m都是整数;

“{n,}”   匹配n到无穷次之间任意次数;

“{,m}”   匹配0到m之间任意次数;

数量限定符号放到匹配格式的后面,例如:电话号码:024-84820482,02484820482(假设前面3或者4位,后面7或者8位,并且中间的减号可有可无),都是符合规定的,那么可以用如下格式来匹配:[0-9]{3,4} \-? [0-9]{7,8};注意:“\”为转义字符,因为“-”在正则表达式用有代表一个范围的意义,例如:前面所说的[0-9],所以它需要转义字符“\”进行转义才可使用;

4、^为否符号,表示不想匹配的符号,例如:[^z][a-z]+可以匹配所有除"z"开头的以外的所有字

如果^放到[]的外边则表示以[]开头的字符串;^[az][a-z]+表示a或者z开头的长度大于等于2的英文字符串;

5、“|”或运算符,例如:a[n|bc|cb]c可以匹配“abcc”,“anc”,“acbc”;

6、“$”以它前面的字符结尾的;例如:ab+$就可以被“abb”,“ab”匹配;

7、一些简单表示方法:\d表示[0-9];\D表示[^0-9];\w表示[A-Z0-9];\W表示[^A-Z0-9];\s表示[\t\n\r\f],就是空格字符包括tab,空格等等;\S表示[^\t\n\r\f],就是非空格字符;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/msgsnd/archive/2008/02/26/2122440.aspx

转载于:https://www.cnblogs.com/lanjianhappy/p/7171341.html

sscanf高级用法级正则表达式相关推荐

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

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

  2. scanf,sscanf高级用法

    最近遇到了解析配置的问题,用正规表达式感觉大题小做,使用sscanf因只会用基本用法,感觉功能不够,上网搜了下,解析起来不费吹灰之力,代码也很简洁. 原帖出处不详,网上到处是,我做了点修改 名称: s ...

  3. sscanf高级用法

    理解了%[^|]|这个模式就基本能解析复杂字符串了. 这个模式是%s的一个正则表达式方向的进化,本意也是要取字符串,但是是有选择的取.如何选择,就写在[]中.其中的^表示"不取", ...

  4. python3.7正则表达式语法_python3正则表达式的几个高级用法

    python3正则表达式的几个高级用法 一. 概述 本文举例说明python3正则表达式的一些高级级法,主要是各类分组,可应用于 1.复杂网页文件中的有用数据 例如,采用爬虫技术取得网页后,对网页内任 ...

  5. sscanf的高级用法

     sscanf的高级用法(总结) 2012-04-25 18:50:25 分类: C/C++ sscanf(recvbuf,"%*[^/]/%[^ ]s",buf_rev);    ...

  6. JAVA正则表达式高级用法(分组与捕获)

    2019独角兽企业重金招聘Python工程师标准>>> 正则表达式在字符串处理中经常使用,关于正则简单的用法相信有一点程序基础的人都懂得一些,这里就不介绍简单基础了.这里主要讲解一下 ...

  7. sscanf和sprintf的高级用法

    sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大得两个函数 头文件 stdio.h 原型 int sscanf( const char *buffer ...

  8. vim的高级用法配置以及在系统中如何获取帮助

    vim的高级用法配置以及在系统中如何获取帮助 1 vim的三种模式 1.1 使用方法 1.2 vim模式 2 vim工作的基本配置 2.1 临时设定(set设定) 2.2 永久设定方式 3 搜索 4 ...

  9. sed的基本用法和高级用法

    sed 的详细用法 sed:stream editor 流编辑器 sed的工作模式:sed是一个行文本编辑器,默认每次处理文本中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把 ...

最新文章

  1. C++ 和 Java,你选哪个? | 每日趣闻
  2. 【C++ 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 )
  3. 分享几个在线生成网址二维码的API接口
  4. Platform Builder 6.0与Windows 7兼容性的问题
  5. 表单文本框提示字符点击时清空
  6. 前端-html、css
  7. 现实版“神笔马良”!“90后”小伙把贫困村画成网红景点!
  8. php odbc 结果集处理,php常用ODBC函数集的简单示例
  9. 《Spark Cookbook 中文版》一导读
  10. 16 寸MacBook Pro比14 寸风扇更强大,更耐用
  11. 07. Java中的类和对象(嗜血无敌战神破解版)
  12. 503热敏电阻温度阻值对应表
  13. 使 div 水平 垂直 居中
  14. 对于硬盘做了raid的Windows server 2016服务器重置密码
  15. 防止软件进行微信小程序自动刷票、免费投票刷票器手机版的安全设计
  16. 什么是预付卡及预付卡发展前景
  17. QCustomPlot系列 进行框选放大(二)
  18. Unicode中的UTF-8, UTF-16, UTF-16LE, UTF-16BE编码及转换 | Java基础
  19. Node.js运行app.js时候报错933
  20. 快递员能开你家锁了,问你怕不怕?

热门文章

  1. Landsat 8 OLI_TIRS 卫星数字产品
  2. saltstack之远程触发文件备份、回滚
  3. 解决Android的ListView控件滚动时背景变黑
  4. 【转】POJ 2104 K-th Number(2)
  5. mysql出现多线程操作同一个表的情况,应该怎么办?
  6. 企业架构-发布【企业架构框架-TOGAF v0.1.pdf】
  7. 王达:影响100万网管员的“网管员”『英雄故事』
  8. (Easy) Height Checker LeetCode
  9. OpenCv 009---色彩空间与色彩空间转换
  10. nvm 解决nodejs无法全局/usr/bin/node问题