现在的位置: 首页 > 综合 > 正文

c语言的输入和输入缓冲机制

2013年09月11日 ⁄ 综合 ⁄ 共 1095字 ⁄ 字号 评论关闭

好长时间没有来了,最近一直比较忙,总算等到了十一,可以干自己喜欢的事情了,今天看到了一个帖子,讲的是c语言的输入缓冲,首先我们来看一个程序:代码(感谢lieyu063 的帖子):这个程序在原来的基础上面做了一点修改,在win-tc 1.7.2上运行通过,并且进行了测试

#include <stdio.h>
#include <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()函数等待输入直到按回车才结束,  回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。

抱歉!评论已关闭.