博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助
在我的系统上成功不代表在你的系统上也成功。请按自己的需要进行修改。 1. /usr/share/doc下一定要看 2. 更详细的可以看看man, 看man 的时间远小于上网找答案的时间
  cobalt65.cublog.cn

关于作者
Debian stable
Email:angelerosster@gmail.com
|| << >> ||
我的分类


验证表达式getchar()!=EOF的值是0还是1
本题是<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;
}

发表于: 2007-12-20,修改于: 2007-12-20 18:28,已浏览258次,有评论0条 推荐 投诉


网友评论
 发表评论