C语言中的scanf函数:

本文深入探讨了C语言中scanf函数的使用细节,包括如何正确处理缓冲区中的换行符,以及如何避免常见陷阱,例如意外读取到的/n字符。文章提供了具体的代码示例来说明如何使用fflush(stdin)解决这些问题。

参考:
C语言scanf函数详细解释:
http://blog.youkuaiyun.com/kobesdu/article/details/39051399


#include <stdio.h> 
int main() 
{ 
    int a; 
    char c;
    do 
    { 
        scanf("%d",&a); 
        scanf("%c",&c); 
        printf("a=%d     c=%c/n",a,c); 
        /*printf("c=%d/n",c);*/ 
    }while(c!='N'); 
}

scanf(“%c”,&c);这句不能正常接收字符,什么原因呢?我们用printf(“c=%d/n”,c);将C用int表示出来,启用printf

(“c=%d/n”,c);这一句,看看scanf()函数赋给C到底是什么,结果是 c=10 ,ASCII值为10是什么?换行即/n.对了,我们

每击打一下”Enter”键,向键盘缓冲区发去一个“回车”(/r),一个“换行”(/n),在这里/r被scanf()函数处理掉了(姑且

这么认为吧^_^),而/n被scanf()函数“错误”地赋给了c.
解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch(); getchar();也可以,但是要视具体

scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。
函数名: fflush
功 能: 清除一个流

2.缓冲区问题
这是一个非常容易错的地方,我就错过多次。

#include <stdio.h> 
main() 
{ 
int n = 5; 
char c[n]; 
for(int i = 0; i < n; i++) 
c[i] = scanf( "%c ",&c[i]); 
printf(c); 
return 0; 
} 

如果输入:
a
b
c
那么循环就会“提前”结束了.
原因:输入a和第一个回车后,a和这个回车符都留在缓冲区中。第一个scanf读取了a,但是输入缓冲区里面

还留有一个/n,第二个scanf读取这个/n。然后输入b和第二个回车,同样的,第三个scanf读取了b,第四个

scanf读取了第二个回车符。第五个读取了c。所以五个scanf都执行了,并没有提前结束。只不过有的scanf

读取到了回车符而已。
解决方法:把程序改成这样就可以了:
for( i = 0; i < n; i++){
scanf( “%c “,&c[i]);
fflush(stdin);//刷新缓冲区
}
或者不用scanf,而用gets()函数,如:

#include <stdio.h> 
main() 
{ 
char c[5]; 
gets(c); 
printf(c); 
return 0; 
} 

但要注意:这个函数自动把你最后敲的回车转换为字符 ‘/0 ‘。如果你的输入超过了数组的大小,那么就会产
生错误

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值