前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >scanf的正则表达式总结

scanf的正则表达式总结

作者头像
sean.liu
发布2022-08-03 14:48:46
7860
发布2022-08-03 14:48:46
举报

scanf作为C语言的格式化输入函数,定义于stdio.h中,本文总结一下scanf与正则表达式相关的地方。(注意:假设输入中无空格,空格将做特殊说明)

代码语言:javascript
复制
//scanf函数原型
int scanf(const char *format,...);

*format指向一个描述输入格式的字符串,使用正则表达式匹配时从左往右,如果某个匹配没有执行,那么后面的匹配也就不会执行下去。

代码语言:javascript
复制
scanf("%d%s",&x,str);
//输入 hello
//会有什么情况呢
//%s是匹配hello的,但是%d不匹配,所以整个匹配过程无法执行下去,所以变量没有接收任何值。

正则表达式匹配使用贪婪算法,即算法可能多的匹配字符。

代码语言:javascript
复制
//比如
char str[10],int x;
scanf("%s:%d",str,&x);
printf(%s %d,str,x);
//输入 kryptosx:001
//你预计输出 kryptosx 001
//但事实上输出 kryptosx:001 4252772

这是因为%s在匹配时直接把”kryptosx:001“全匹配掉了,应为贪心要求尽可能的匹配。4252772是x未初始化的值,因为x并没有匹配到输入。

匹配的集合操作 [a-z0-9] 表示匹配a到z中任意字符,以及1到9的任意字符。 [zJ3.] 匹配'a','J','3','.'中任意一员。 [^a-z] 匹配非a-z中的任意字符,^表示取反。

代码语言:javascript
复制
//示例
scanf("%[a-z]",str);
printf("%s:",str);
//输入 aasdfwer234234
//输出 aasdfwer

scanf("%[^a]a%d",str,&x);
//这里注意的是[^a]后的a,思考一下为什么这后面要带个a。

%符号总结 %后跟着读取的符号,除了*外,顺序对应后面的变量(准确的说是变量地址),通常的%s,%d就不说了,很常用。 %4s,表示匹配长度为4的字符串,%4d等类同。 %*是指忽略匹配的字符,比如“%*[a-z]”,忽略匹配[a-z]的字符。可以把%*看作%的兄弟,只是%是读入到变量,%*是跳过。

代码语言:javascript
复制
//网上的一个题目
//从<sip:tom@172.18.1.133>中取出tom
scanf("%*[^:]:%[^@]",str);
//分析:首先,%*[^:]忽略掉开头字符串,直到:,然后读取tom,以@为终止符。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年4月17日0,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档