本题是<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;
}
|
阅读(7138) | 评论(4) | 转发(0) |