一、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:abcdPS:%[^\n] 表示 读取回车符以前的所有字符,常用于读取含空格的字符串。
%[^ ] 表示 读取空格符以前的所有字符。 -
scanf("%*[^\n]%d", &num);
表示过滤掉回车以前所有的字符,并将回车符的下一个数字赋给num。
输入:abcd\n12
输出num:12PS:%*[^ ]表示过滤空格以前的所有字符
-
scanf("%*[^\n]");
scanf("%*c");
可以使用该组合语句清空缓冲区中\n及其以前的内容,用在其他的scanf();语句之后,切记不可把两句合二为一,否则当输入缓冲区只有一个\n时,合成一个之后,第一个%匹配失败(没能匹配到一个非\n字符用来跳过)就直接结束匹配了,然后就执行下一条语句了,\n还是留在缓冲区里
二、int printf(const char *format, …);
(一)函数介绍
- format,一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。
- 返回值,打印字符的个数。比如打印%d的int i = 123;返回值位3.打印字符串“123\n”,返回4
(二)函数机理
printf标准函数把要显示的内容放在输出缓冲区里,计算机在合适的时候把输出缓冲区里的内容显示在屏幕上,在以下四种情况下计算机会把输出缓冲区里的内容显示在屏幕上
- 如果输出缓冲区里包含’\n’字符就把
它前面的内容显示在屏幕上 - 程序结束后计算机会把程序放在输出
缓冲区里的内容显示在屏幕上 - 当输出缓冲区被充满的时候它里面的内容
会显示在屏幕上 - 可以使用fflush(stdout)语句强制把输出
缓冲区里的内容显示在屏幕上
注:scanf函数也可以把输出缓冲区里的内容显示到屏幕上,至于其实现机理并未深究(可能是scanf调用了fflush函数,也可能是在scanf内部,类似fflush函数同样代码由敲了一遍)