c语言的输入缓冲

本文通过一个具体的C语言程序示例,深入解析了输入缓冲的工作原理,并提供了几种解决因输入缓冲导致程序提前结束的方法,包括使用fflush(stdin),更改scanf的格式说明符,以及采用gets()或scanf()的一次性字符串读取。

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

今天看到了一个帖子,讲的是c语言的输入缓冲,首先我们来看一个程序: 代码(感谢 lieyu063 的帖子):这个程序在原来的基础上面做了一点修改,在win-tc 1.7.2上运行通过,并且进行了测试

#i nclude <stdio.h>
#i nclude <stdlib.h>

void main()
{
    int n = 5;
    int i ;
    char c[5];
    for(i = 0; i < n; i++)
    {
        c[i]=scanf(" %c",&c[i]);
       /* fflush(stdin);*/
        /*printf("%c/n",c[i]) ;*/
    }

    for(i=0;i<n;i++)
    printf("%d",c[i]);
    getch();
}

我们在运行程序的时候,输入如下

a
b
c
程序便宣告结束,而实际上程序的循环有五次,我们应该输入5次程序才会结束的,这是什么原因呢?我们先看看c语言中的输入缓冲:C语言编译器I/O输入函数一般采用了缓冲式输入方式。也就是说,当你输入“a回车b回车c回车”时,程序先输入a但同时将回车缓冲区里,然后下次再从缓冲区里取出数据,也就是回车。依次类推。可以用getchar()解决问题。根据上面的介绍, 我们再来分析我们的输入过程:

a 回车

b回车

c

恰好从缓冲区内读取了5次,因此我们的程序宣告结束了。有什么方法解决这个问题呢?

1、在每次读取之后,将缓冲区刷新——使用fflush(stdin)函数;

2、scanf("%c",&c[i]) ; 改成scanf(" %c",&c[i]) ;注意在"%c"前面加上一个空格;

3、完全杜绝这种情况发生,使用gets()函数,或者scanf("%s",c) ;一次性作为一个字符串读入;

下面再介绍一下getch,getche(),getchar();的区别,这几个函数的使用实在是太多了,这三个函数的区别一直都不清楚,今天终于有机会弄明白了:

getch()和getche()函数
 这两个函数都是从键盘上读入一个字符。其调用格式为:
  getch(); 
  getche();
 两者的区别是:getch()函数不将读入的字符回显在显示屏幕上,而getche() 函数却将读入的字符回显到显示屏幕上。 

getchar()函数
 getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数的区别在于: getchar()函数等待输入直到按回车才结束,  回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值