(1) 首先看一个程序 :
发现了一个问题: “scanf()函数吃掉了后面的数据” .
(2) scanf()函数接收数据时, 遇到以下情况将会结束一个数据的输入 :
① 遇空格、回车、跳格键 .
② 遇宽度结束 .
③ 遇非法输入 .
*所以上面的例子中遇到空格scanf()函数将认为是对str1的赋值结束, 并忽略后面的”love you”, 不过”love you”还在键盘缓冲区中,
(3) 测试程序 :
#include<stdio.h> #include<windows.h>
int main() { char str1[90]; char str2[90]; char str3[90]; scanf("%s",&str1); printf("%s\n",str1);
Sleep(5000); // 要程序暂停5000毫秒
scanf("%s",&str2); // 不是用来输入的, 是让程序对键盘缓冲区再扫描 scanf("%s",&str3); // 不是用来输入的, 是让程序对键盘缓冲区再扫描
printf("%s\n",str2); printf("%s\n",str3);
return 0; } |
当输入”i love you”时, 程序会先输出”i”, 间隔5000毫秒后程序会继续输出”love you” .
(输入”i love you”开始只会输出”i”)
(等待5000毫秒后, 程序将中输出”love you”)
* 键盘的所有输入都在缓存中, 只是scanf函数将第一个空格作为数据赋值的结束符号, 后面再使用多个scanf对缓冲区进行扫描的时候, 就能将所有的缓冲数据获取, 并赋给变量 .
(4) 顺便提提清空缓冲区操作 :
① fflush(stdin);
② rewind(stdin);
* 如果将上面这两个的任意一个放到Sleep(5000)后面, 则程序只会输出”i”, 后面两个scanf()不会再扫描缓冲区的数据了, 只会等待用户的输入两次才能结束程序 .
(5) “%[] 扫描字符集合” :
a. 该字符集是scanf的格式控制的一种, 类似”%d”、”%c”, 括号中就为需要匹配
的内容, 比如”%[a-z]”即为匹配小写英文字母;
需要注意的是这样的匹配只是从输入的所有字符中从前向后找, 从第一个字符
起只有符合匹配要求才会继续找, 遇到不符合要求则直接结束scanf函数, 所以
只要一开始就不符合则相当于没输入 .
b. 还可使用”^”, 使用”^”的作用是限制获取的终点, 如”%[^a123]”则如果输
入”sdfddgadasdsada123sdfdsfjsdjf”, 则匹配后只会将”sdfddg”作为输入的内容, 所
以可知作用是将中括号中的任一个字符作为结束的终点 :
该格式最大的用处就是解决上面所出现的”scanf吃掉空格”现象, 既可以限制程
序在某个字符前的所有字符作为一个数据的值 :