直接离开K& R,我有
#include <stdio.h>
main() {
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
我在Mac OS X上,所以我编译它,运行它,键入“12345”,按Enter键换行换行符(这是我猜的第六个字符)然后点击ctrl-D发送一个EOF。 / p>
东西打印出“6D”。为什么D在那里?如何编写一个程序来计算“12345”中的5个字符而不是换行符?我应该在最后减去一个吗?如何让它停止打印D?
答案 0 :(得分:9)
当您键入时,终端实际回显您的控件-D(并将其打印为^D
),然后您的程序用数字覆盖该行。换行。因此,您的一位数字会覆盖^
,但D
会留在那里。
如果您输入的字符数超过10个,或者通过在格式字符串末尾添加空格("%ld \n"
)来更改代码,那么您的程序将覆盖^D
(尽管它会仍被你的终端所呼应)
答案 1 :(得分:1)
程序运行正常:打印6。
你看到6D因为终端窗口打印^ D然后回到行的开头,你的程序在^上打印6留下以下D.尝试将输出重定向到一个文件,或给它足够的输入答案有多个数字,你不会看到D。
由于换行符,答案是6而不是5,是的。如果您不想在最后计算换行符,请减去1.如果您不想计算任何换行符,请在看到换行符时减去1。