我觉得,在输入输出函数中,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,这又是为什么?
stdin缓冲区中的数据残留 : scanf("%3s",str); c= getchar(); 输入: aaabbccc回车, 此时str="aaa",c='b'; //缓冲区中数据残留!
getch()不经过缓冲区,直接接收键盘上输入的字符.
//在上例中,加上一个 ch=getch(); 但是getch()并不能读取bbccc中的任何一个,说明 getch()与getchar()并不一样,并且它们对Enter读取的值也不同!
一个不常用的格式符: %[] ,如 scanf("%[a-z]",str);
输入: abcdefdsaABCDEF 输出:str="abcdefdsa" ;
怎么用scanf()来输入一个有空格的字符串?
scanf()处理时,一个Enter送到缓冲区中有两个值 : 一个回车(10) ,一个换行(13). 可以用 getchar()来接收(但是,在只能接收到/n,即13).
在一个scanf()函数之后加个fflush(stdin)可以清除输入数据残留?
scanf("%3s",str); fflush(stdin); c=getchar();
直接输入 aaabbbddd回车, c还能取得值吗?
下面是详细解释:
scanf()函数执行成功时的返回值是成功读取的变量数 , 也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。
scanf()- 函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
sscanf() - 从一个字符串中读进与指定格式相符的数据.
函数原型:
Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入