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