`
deepfuture
  • 浏览: 4331820 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79401
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68340
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101463
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281100
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14594
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65528
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31304
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45181
社区版块
存档分类
最新评论

c-scanf键盘缓冲区残余信息问题

阅读更多

键盘缓冲区残余信息问题 

#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 
功 能: 清除一个流 
用 法: int fflush(FILE *stream); 
#include <stdio.h>
int main()
{
    int a;
    char c; 
    do
    {
        scanf("%d",&a);
        fflush(stdin);
        scanf("%c",&c);
        fflush(stdin);
        printf("a=%d     c=%c\n",a,c); 
    }while(c!=''N'');
}      
这里再给一个用“空格符”来处理缓冲区残余信息的示例: 
运行出错的程序: 
#include <stdio.h>
int main()
{
    int i;
    char j;
    for(i = 0;i < 10;i++)
    {
        scanf("%c",&j);/*这里%前没有空格*/
    }

使用了空格控制符后: 
#include <stdio.h>
int main()
{
    int i;
    char j;
    for(i = 0;i < 10;i++)
    {
        scanf(" %c",&j);/*注意这里%前有个空格*/
    }

    可以运行看看两个程序有什么不同。 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics