我觉得,在输入输出函数中,scanf()函数,应该是最麻烦的,有时它给我们的结果很可笑,但是一定是一原因的....
首先声明一下,这篇日志不是介绍scanf()中各种格式符用法的文章(没有这个必要,但是大家一定要会用).
我尝试了很多种输入,包括一些错误的练习,曾经对scanf()由迷茫转向清醒,又由清醒再次转向迷茫......不知道何时是个尽头,谁让C如此高深呢?
在这里贴出来,也是想让自己时而不时能看到,也想知道自己的理解是否有错,错在哪里(所以我就厚着脸皮,放在上面了).
注意 , 键盘缓冲区 与输入有着密切的关系 ,并且, 类型匹配 对 输入也极为重要!!
下面进入主题:
scanf对流的操作遵从类型匹配操作原则,如果类型不匹配,它将不读取输入流。 因此输入流将滞留,如果输入流不空,scanf不会等待用户输入,直接从缓冲区中输入.
但是,scanf() 怎样匹配? stdin又是什么?
在网上搜到的关于匹配的非常少,有些细节原因还是找不到.
所以,我自作主张的下了点结论:
例: scanf("%d,%d",&i,&j); 输入:12 ,13回车 但是,j!=13. //注意,12后有一个空格,why?
原因:我解释为,在scanf()中,格式字符串中普通字符(不包括空白字符)实行的是 严格匹配,因为格式串中%d后面是一个 ',' ,因此输入中数字12后必须为一个','.
scanf("1123%s",&str); 输入:1123aaabb 时str为 aaabb,但是,输入 24aabbdd时, 会出错,因为1123必须进行严格匹配.
另外: scanf("%d\n",&i); printf("i=%d",i); 要怎么输入才能输出: i=12 ? 它不是你想像中的那样,有机会尝试一下吧!
一些样例:
scanf()是一个有返回值 的函数,它的返回值是什么?怎么样利用这个特性?
scanf()中的匹配原则: 在本文 第五点 具体说明...
scanf()中各种数据格式匹配的开始条件,结束条件 .
如: %d ,\n等类型输入结束条件.
scanf("%d\n",&i);printf("%d",i); 输入 12回车,并无输出,why?
scanf()函数的结束条件: 当各个 格式符 匹配完毕,且最后有一个回车时,函数结束.
scanf("%s",str)连续输入127个就不能继续输入了. //TC中,VC好像是4000多..
//说明键盘缓冲区长度为一个字节吗?但是 stdin->bsize(缓冲区大小)事实上为 512,这又是为什