C语言中字符串的输入输出等问题

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的区别

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值