C语言scanf()函数的诡异事件

(1) 首先看一个程序 :

 

发现了一个问题: “scanf()函数吃掉了后面的数据” .

(2) scanf()函数接收数据时, 遇到以下情况将会结束一个数据的输入 :

① 遇空格、回车、跳格键 .

② 遇宽度结束 .

③ 遇非法输入 .

*所以上面的例子中遇到空格scanf()函数将认为是对str1的赋值结束, 并忽略后面的”love you”, 不过”love you”还在键盘缓冲区中,

(3) 测试程序 :

#include<stdio.h>

#include<windows.h>

扫描二维码关注公众号,回复: 118689 查看本文章

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吃掉空格现象, 既可以限制程

序在某个字符前的所有字符作为一个数据的值 :

 

猜你喜欢

转载自blog.csdn.net/i_pangpang/article/details/79805216