Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1619878
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2008-08-14 12:56:56

写一个程序, 将输入复制到输出, 你可以用getchar和putchar这2个函数,用一个循环就能搞定, 可是你有可能发现, 你无法正常结束这个程序。 还是看一下代码先:


#include <stdio.h>

int main()
{
    /*
          only when you press enter, the putchar will excute
          for example, you input a 'x', no enter, then you will
          find that nothing will output, the putchar not excute,
          only when press enter, the putchar excute, like this:
          $ getch
            a(enter)
            a
          if you input a string "abcdefgh", and then you input
          key, then the whole string will commit to system, and then
          the putchar excute, like this:
          c:\> getch
               abcdefgh(enter)
               abcdefgh
               ^Z(CTRL+Z, to exit the while loop)
               ok, i will exit.
        */

    int c; /*it's int, not char*/
    while ( (c = getchar()) != EOF )
        putchar(c);
    printf("\nok, i will exit.\n");
    return 0;
}
/*
   well, in windows, you should press CTRL+Z or CTRL+C to end this loop
   and in linux, you should press CTRL+D to end this loop.
*/


针对这段代码有3个问题:
1. 既然输入的是字符, 为何是int c;而不是char c;
2. EOF是什么, 我如何输入这个EOF来结束这个while循环
3. 输出的结果是怎样的

首先, 来解决第一个问题。 getchar 必须能区分文件中的有效数据和输入结束符, c语言采取的办法是,在没有输入时,getchar函数返回一个特殊值,这个特殊值与任何实际字符都不同,这个值称为EOF(end of file), 所以, 我们在声明变量c的时候, 必须能够让它容纳getchar的任何返回值, 这一点char类型的声明是做不到的, 所以, 我们用了int类型。

前面已经提到, EOF是end of file的意思, 即文件结束, 通常是-1。 其实,它是什么值不重要, 只要它与任何char类型的值都不相同即可, 而这个常量的定义, 可以确保程序不依赖于其对应的任何特殊数值。
我们在程序中, 要正常结束这个循环, 对于windows或DOS系统, 可以用CTRL+Z来结束, 其实在windows下, 用CTRL+C也是可以正常结束(因为我用CTRL+C结束程序之后,能看到ok, i will exit.这句话,如果是非正常结束的话, 这句话就不会出现)的, 但是在DOS下, CTRL+C表示强制结束程序, 可能就不行了。 对于linux, 可以用CTRL+D正常结束。

最后一个问题, 它的输出是什么样的,比如这个程序编译链接之后, 生成的可执行文件叫做getch.exe(这里只讨论windows或dos平台下):
c:\>getch.exe
    a
当执行getch.exe之后,程序等待键盘输入, 我输入a之后, 没有按回车, 从程序的逻辑上来看, 当我们输入了一个字符之后, 应该输出一个字符才对, 实际上, 并非如此, 你必须输入回车之后, 才能在屏幕上看到putchar的输出,即:
c:\>getch.exe
    a<回车>
    a
当我们连续输入多个字符, 即一个字符串的时候, 只要我们不回车, 那么程序仍旧等待你的输入, 当你输入了回车之后,你会发现, 程序会一次性把所有你输入的字符在屏幕上输出,即:
c:\>getch.exe
    abcdefghijkl<回车>
    abcdefghijkl
然后, 程序继续等待你的输入, 直到你输入了CTRL+Z结束了循环,程序才在最后输出ok, i will exit.然后退出。这里似乎看起来有些不合逻辑, 我们用c = getchar()获取一个字符之后, 按道理, 如果不是EOF的话, 程序应该立刻用putchar(c)输出那个字符, 可是为什么我们输入了一大堆的字符按回车之后,却把一次性的把所有的字符都输出来了。 其实是这样的, getchar是从文件中读取字符的, 你用键盘敲进这些字符, 只有你按回车之后, 这个键盘输入才作为一个标准的输入文件(stdin)然后才交给getchar()俩处理, 也就是说,你输入了abcdefghijkl按回车之后, 程序把你的整个输入作为一个标准输入文件来处理,getchar读取一个字符, putchar就输出一个字符, 当所有的字符都读完了之后, 没有发现结束符EOF, 于是getchar的返回值也不是EOF, 这样程序继续循环, 继续等待输入, 直到遇到了结束符EOF。

关于上述情况的讨论, 你可以参看下面的帖子:




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