Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137531
  • 博文数量: 32
  • 博客积分: 582
  • 博客等级: 中士
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-24 22:38
文章分类

全部博文(32)

文章存档

2012年(3)

2011年(29)

我的朋友

分类: C/C++

2012-01-01 22:16:56

关于getchar()的问题,我建议先去下面的网站看看http://hi.baidu.com/golny/blog/item/6dc1791cc72e8c9787d6b606.html

问题由来:

设计并测试一个函数,可以从输入读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。

本来以为简单的一到c编程题,我本想用getchar来实现,但发现了一大堆关于getchar的问题。下面只是我的测试程序

  1. #include
    #define MAX 20
    char * getnchar(char * str, int n);
    void main(void)
    {
        char input[MAX];
        char *chk;
        char n;
        scanf("%d",&n);
        fflush(stdin); //清空键盘缓冲区
  2.     chk = getnchar(input, n-1);
        if (chk == NULL)
            puts("Input failed.");
        else
            puts(input);
        puts("Done.\n");
       
        getch();
        //return 0;
    }
  3. char * getnchar(char * str, int n)
    {
        int i;
        int ch;
  4.     for (i = 0; i < n; i++)
        {
            ch = getchar();
            if (ch != EOF)
                str[i] = ch;
            else
                break;
        }
        if (ch == EOF)
            return NULL;
        else
        {
            str[i] = '\0';
            return str;
        }
    }

问题:

    如果不输入n的值的话,就是说在输入字符串之前没有输入其它的字符的话,是能够完好的输出输入的值的。而加入了输入n之后,输出就只能是前面n-1个字符。原来问题出在键盘输入输入缓冲区,所以必须借用fflush(stdin)来清空输入缓冲区。

getchar的总结:

总结1:

while((c= getchar()) != EOF){
putchar(c);
}


执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。


对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF (Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。

总结2:

如果有多个字符串输入(即前面需要输入一个字符或字符串,后面又需要输入一个字符或字符串),需用fflush(stdin)函数来先清空前面的键盘缓冲区,然后在接着输入其它的字符(或者字符串)。

阅读(1555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~