scanf中的正则表达式
- 法则:[ ]内是匹配的字符;^表示求反集,当遇到非集合内的字符时立即终止输入。
- 例如:%[abc]、%[a-z]、%[ ^abc]、%[ ^a-z]
1、可以定制自己的扫描集
-
即只扫描%[ ]里面的字符
-
%[a-z] 中-可以代表范围
-
具体示例:
-
示例1:输入指定范围的小写字母,遇到非法字符立即终止
scanf("%[a-z]",str1); printf("%s\n",str1); //输入:abc123 //输出:abc
-
示例2:输入带空格的自定范围的字符串
scanf("%[a-z A-Z0-9]", str1); //a-z和空格和A-Z和0-9都读取 printf("%s\n",str1); //输入:abc123 def 456 //输出:abc123
2、可以遇到某特殊符号就终止输入
-
遇到%[ ^ a-z]里面的字符停止向后扫描
-
即里面的是停止符
-
示例3:输入不包括指定字符的字符
scanf("%[^a-z]", str1); //以a-z为结束标志 printf("%s\n",str1); 输入:123 456abc123 输出:123 456 注意:这种方式可以读入空格
-
示例4:读入一整行字符串,包括空格
scanf("%[^\n]", str1); printf("%s\n",str1); 输入:abc123 def 输出:abc123 def
3、可以跳过一些字符读取指定范围的字符
-
% * 表示跳过指定范围的字符
-
示例5:表示跳过指定范围的字符再读取指定范围的字符
scanf("%*[a-z0-9]%[^\n]",str1); //跳过小写字母和数字,读取到结尾 printf("%s\n",str1); 输入:a1b2c3ABCdef 123 输出:ABC
-
示例6: %和%*组合使用可以提取指定字符串
//从<sip:tom@172.18.1.133>中提取tom const char* url = "<sip:tom@172.18.1.133>"; char uri[10] = {0}; sscanf(url,"%*[^:]:%[^@]", uri); printf("%s ",uri); //从iios/12DDWDFF@122中提取12DDWDFF const char* s = "iios/12DDWDFF@122"; char buf[20]; sscanf(s, "%*[^/]/%[^@]", buf);
注:
- 1、%表示选择,%后面的是条件,比如"%s",s是一个条件,表示任意字符。
- 2、%* 与%刚好相反,表示过滤满足条件的字符,也就是跳过满足条件的字符,其后一定要有新的%语句,否则无法读入
- 3、^表示"非",[ ^\n]表示读入换行字符就结束读入。
- 4、scanf不能接收空格符,一接受到空格就结束读入,所以不能像gets()等函数一样接受一行字符串,但是使用%[ ^\n]就可以读取一行,直到碰到’\n’才结束读入。
- 5、* 表示该输入项读入后不赋予任何变量。
- 即scanf("%*[ ^\n]% *c")表示跳过一行字符串。其中%*c可以把’\n’吸收掉,防止影响后续输入。
小结:
1、%[ ^\n]表示读取一个字符集,以\n作为结束标志,\n后不读入字符串。同理%[ ^a-z]表示以a-z中任一个字符为结束标志。
2、[ ]内是匹配的字符;^表示求反集,当遇到非集合内的字符时立即终止输入;* 表示的是跳过。
3、"%*[a-z0-9]%[^\n]",str1);表示跳过小写字母和数字,读取到结尾。
scanf与getchar、gets的区别
1、用scanf输入数值类型(int、float、double等)
- 不管中间有多少空格有多少回车,都不会中断scanf的录入,直到到达scanf中规定的录入数量。
- 具体的可以查看scanf输入的例子
2、scanf输入字符类型(char)
- scanf时“%c”前面有空格,scanf 从第一个非空格/回车字符开始录入。
- scanf时“%c”前面没有空格,scanf会将键盘录入的任何一个键入都作为录入(空格看作空白字符,回车看作换行符),多余的部分存入缓存区。
- 接收到的和输出的是 %c。
char a, b;
scanf("%c%c", a, b);
printf("a = %c, b = %c\n", a, b);
printf("a = %d, b = %d", a, b);
3、输入字符串时
- scanf当它遇到空格、回车、或者Tab键时,都会自动停止输入,剩余部分存入缓冲区。
- 接收到的和输出的是 %s。
char s[100];
scanf("%s", s);
printf("%s", s);
4、gets的使用
- 库函数: <stdio.h>
- gets()主要用来接收字符串,可以接收空格,遇到‘\n’时结束,但不接收‘\n’,把 ‘\n’留存输入缓冲区。
- 把接收的一串字符存储在形式参数指针指向的空间,并在最后自动添加一个’\0’。
char str;
gets(str); //将这一行的字符串放入str中
5、getchar的使用
- 库函数: <stdio.h>
- getchar()主要用来接收单个字符,不管是空格或者回车都可以接收。
- 例如:(c = getchar()) != ’\n’ 则表示遇到回车的时候结束接收字符。则表示遇到回车的时候结束接收字符。(注意(c = getchar()))的括号,不写输出的是空框。
char c = getchar();
//while((c = getchar()) != ’\n’) //读取到这行的末尾
总结
scanf
- 用scanf输入数值类型:
- 不管中间有多少空格有多少回车,scanf都不会读取(空格或回车)或中断录入,直到到达scanf中规定的录入数量。
- 例子:scanf("%d%d%d%d", &a, &b, &c, &d); ——%d
- 用scanf输入字符类型:
- scanf时“%c”前面有空格,scanf 从第一个非空格/回车字符开始录入。
- scanf时“%c”前面没有空格,scanf会将键盘录入的任何一个键入都作为录入(空格看作空白字符,回车看作换行符),多余的部分存入缓存区。
- 例子:scanf(" %c %c", a, b); ——%c
- 用scanf输入字符串类型:
- 遇到空格、回车、或者Tab键时,都会自动停止输入,剩余部分存入缓冲区。
- 不能接收空格也不能接收‘\n’
- 例子:scanf("%s", s); ——%s
gets
- gets()主要用来接收字符串。
- 可以接收空格,但不能接受‘\n’.以‘\n’为结束
- 接收下一行数据的时候需要先使用 **getchar()**将‘\n’取出。
getchar
- getchar()主要用来接收单个字符。
- 可以接收空格也可以接收‘\n’。
字符串接受结束后自动加\0;因此字符串的长度需要加1!
参考文献
scanf()正则表达式的使用
scanf(“%[^\n]“, str)正则用法,strchr()用法
进击的小白——知识点:scanf与getchar、gets的区别