C语言学习之scanf、printf、正则表达

一、int scanf(const char * restrict format,…)

(一)函数介绍

  • 返回值位成功读入的数据项数
  • format是一个或者多个 {%[*] [width] [{h | l | I64 | L}]type | ’ ’ | ‘\t’ | ‘\n’ | 非%符号}

用户在键盘上输入的数据首先进入输入缓冲区,scanf标准函数从输入缓冲区里获得数据并记录到存储区里,先进入的数据必须被先处理。如果format位%d,而缓冲区中是3.14,则只会将3存入,并且,下一个%d也不能正确的读取,因为.14无法被%d识别所以一直卡在缓冲区

(二)常用简单的正则表达

  • scanf("%ns", str);
    表示读取长度为n的字符串
    输入:123456
    输出str:123 ( 以scanf("%3s", str);为例 )

  • scanf("%[a-z]", str);
    表示读取a-z的小写字母,出现非a-z的小写字母,立即停止读取。
    输入:abcd123
    输出str:abcd

  • scanf("%*[a-z]%s", str); 注:该语句一定要加%s,因为前边有*
    %*[ ]表示过滤掉满足括号内条件的字符串 %[ ]表示读取
    输入:abcd123
    输出str:123

  • scanf("%[^0-9]", str);
    ^表示非,^0-9表示非0-9的一切字符,因此是遇到0-9就立即停止读取。
    输入:abcd123
    输出str:abcd

    PS:%[^\n] 表示 读取回车符以前的所有字符,常用于读取含空格的字符串。
      %[^ ] 表示 读取空格符以前的所有字符。

  • scanf("%*[^\n]%d", &num);
    表示过滤掉回车以前所有的字符,并将回车符的下一个数字赋给num。
    输入:abcd\n12
    输出num:12

    PS:%*[^  ]表示过滤空格以前的所有字符

  • scanf("%*[^\n]");
    scanf("%*c");
    可以使用该组合语句清空缓冲区中\n及其以前的内容,用在其他的scanf();语句之后,切记不可把两句合二为一,否则当输入缓冲区只有一个\n时,合成一个之后,第一个%匹配失败(没能匹配到一个非\n字符用来跳过)就直接结束匹配了,然后就执行下一条语句了,\n还是留在缓冲区里

二、int printf(const char *format, …);

(一)函数介绍

  • format,一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。
  • 返回值,打印字符的个数。比如打印%d的int i = 123;返回值位3.打印字符串“123\n”,返回4

(二)函数机理

printf标准函数把要显示的内容放在输出缓冲区里,计算机在合适的时候把输出缓冲区里的内容显示在屏幕上,在以下四种情况下计算机会把输出缓冲区里的内容显示在屏幕上

  1. 如果输出缓冲区里包含’\n’字符就把
    它前面的内容显示在屏幕上
  2. 程序结束后计算机会把程序放在输出
    缓冲区里的内容显示在屏幕上
  3. 当输出缓冲区被充满的时候它里面的内容
    会显示在屏幕上
  4. 可以使用fflush(stdout)语句强制把输出
    缓冲区里的内容显示在屏幕上
    注:scanf函数也可以把输出缓冲区里的内容显示到屏幕上,至于其实现机理并未深究(可能是scanf调用了fflush函数,也可能是在scanf内部,类似fflush函数同样代码由敲了一遍)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值