scanf作为C语言的格式化输入函数,定义于stdio.h中,本文总结一下scanf与正则表达式相关的地方。(注意:假设输入中无空格,空格将做特殊说明)。
函数原型
//scanf函数原型
int scanf(const char *format,...);
*format
指向一个描述输入格式的字符串,使用正则表达式。
匹配时从左往右,如果某个匹配没有执行,那么后面的匹配也就不会执行下去。
scanf("%d%s",&x,str);
//输入 hello
//会有什么情况呢
//%s是匹配hello的,但是%d不匹配,所以整个匹配过程无法执行下去,所以变量没有接收任何值。
贪婪匹配
正则表达式匹配使用贪婪算法,即算法可能多的匹配字符。
示例:
char str[10],int x;
scanf("%s:%d",str,&x);
printf(%s %d,str,x);
输入 sean:001
你预计输出 sean 001
但事实上输出 sean:001 4252772
这是因为%s
在匹配时直接把sean:001
全匹配掉了,应为贪心要求尽可能的匹配。4252772是x
未初始化的值,因为x
并没有匹配到输入.
匹配的集合操作
[a-z0-9]
表示匹配a到z中任意字符,以及1到9的任意字符。
[zJ3.]
匹配’a’,’J’,’3′,’.’中任意一员。
[^a-z]
匹配非a-z中的任意字符,^表示取反。
示例:
scanf("%[a-z]",str);
printf("%s:",str);
输入 aasdfwer234234
获取 aasdfwer
%
符号
%
后跟着读取的符号,除了*
外,顺序对应后面的变量(准确的说是变量地址),通常的%s
,%d
就不说了,很常用。
%4s
,表示匹配长度为4的字符串,%4d
等类同。
%*
是指忽略匹配的字符,比如%*[a-z]
,忽略匹配[a-z]
的字符。可以把%*
看作%
的兄弟,只是%
是读入到变量,%*
是跳过。
实战
问题一
比如输入的字符串是这样的,sower|234234
,|
是字符串和数字的分隔符。如何截取字符串和数字呢?
答案:
scanf("%[^|]|%d",str,&x);
分析:
这里注意的是[^|]
后的|
,为什么要带上|
呢?它的存在就是为了占掉|
这个字符。
问题二
这是网上的一个题目,从<sip:tom@172.18.1.133>
中取出tom
答案:
scanf("%*[^:]:%[^@]",str);
分析:
首先,%*[^:]
忽略掉开头字符串,直到:
,然后读取tom
,以@
为终止符。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
广告
暂无评论内容