C 中scanf ( ) 函数用法 心得

本文探讨了C语言中scanf函数的使用经验,强调了类型匹配和键盘缓冲区的重要性。作者指出,scanf函数对于格式字符串中的字符进行严格匹配,导致在某些情况下可能出现意料之外的结果。此外,文章还提到了如何处理输入残留和匹配原则,并通过实例解释了如何输入包含空格的字符串。文章最后讨论了键盘缓冲区的污染问题及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我觉得,在输入输出函数中,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)为输入源,前者以固定字符串为输入

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值