Chinaunix首页 | 论坛 | 博客
  • 博客访问: 399182
  • 博文数量: 76
  • 博客积分: 3016
  • 博客等级: 中校
  • 技术积分: 782
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-27 12:05
文章分类

全部博文(76)

文章存档

2017年(1)

2015年(1)

2009年(2)

2008年(28)

2007年(44)

我的朋友

分类: LINUX

2007-12-20 17:07:36

本题是<The C programming>第11页中的练习1-6
我自己是这样写的

#include <stdio.h>

int main()
{
    int c;
    while(c = getchar() != EOF)

        printf("%d\n",c);
    return 0;
}


输出如下:


~/code$

j

1

1

jj

1

1

1

~/code$


当按下 ctrl-D时,程序直接结束,不显示0。显然不符合要求。
之所以产生这个原因,是因为回车也是一个字符,因此按下“j”以后再回车,会显示2个1。而按下 ctrl-D之后,0其实已经被赋给了 c,但程序运行完 while 语句后就停止了,不会再运行下一句 putchar(),因为它收到了ctrl-D结束程序信号。

下面用 gdb 调试证明一下自己的想法。
gdb a.out
break 7              //断在第7行,即 printf("%d\n",c)
display c            //看 c 的值

输入为 “j和回车符”
发现要连续两次 cont 才能让程序重新接受输入。同时,如果什么都不打,就敲回车,发现 c 值也是 1。
由此得证,自己的思路是对的。问题在于 getchar()得到的字符一开始是放在自己的缓冲区里的,所以不会立刻上屏。

至于那个 ctrl-d,好像在 gdb 里面看不到。因为我一按 ctrl-D,程序就结束了。

综上所述,这个练习题的正确代码如下:说来也简单,就是再多加一行 printf,让程序输出一下最后得到的 c 值。

#include <stdio.h>

int main()
{
    int c;
    while(c = getchar() != EOF)

        printf("%d\n",c);
    printf("%d\n",c);

    return 0;
}

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

chinaunix网友2010-08-08 21:40:13

#include int main() { int c; c =( getchar() != EOF) ; printf("%d\n",c); return 0; }

chinaunix网友2009-11-03 19:45:44

楼上理解错了啦。。 先用getchar()!=EOF 验证是0还是1 再把0 或者 1 赋值给c 然后再打印c看结果嘛。。。

chinaunix网友2009-08-04 10:18:31

楼上的,是你错了,没理解这个题目的要求。

chinaunix网友2009-06-10 14:49:00

c = getchar() != EOF 应该括起来吧. (c = getchar() )!= EOF