OSX 10.6.8, GCC 4.2 86_64
#include <stdio.h>
/* count lines in input */
main()
{
int c, nl;
nl = 0;
while ((c = getchar()) != EOF)
if (c == '\n')
++nl;
printf("%d\n", nl);
}
Run
./a.out
press ctrl+d
to send EOF
0D
It should be just 0. Why does it append D? What does it mean?
I've seen this one - it confused me, too.
The terminal is echoing ^D
and then the 0
is output from the program, overwriting the caret.
You can demonstrate this by changing the print format in your program to "\n%d\n"
.
When asked 'Why?', I went exploring. The answer is in the tty settings. For my terminal, the output from stty -a
is:
speed 9600 baud; 65 rows; 120 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^X; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
Notice the echoctl
at the end of the second line - it is for 'echo control characters'.
$ stty -echoctl
$ cat > /dev/null
asdsadasd
$ stty echoctl
$ cat > /dev/null
asasada^D
$
You can't see it, but for each cat
command, I typed a Control-D at the end of the line of asd
characters, and a second one after hitting return. The prompt erased the second echoed ^D
in the second example.
So, if you don't like the control characters being echoed, turn the echoing off:
stty -echoctl
The shell can also get in the way; I experimented with Control-R and my shell (bash
) decided to go into
(reverse-i-search)`': aasadasdadadasdadadadadadsad
I'd typed the unoriginal sequence of 'asd' characters and then typed Control-R, and this is where I ended up in the shell. I interrupted; I'm not sure what a reverse-i-search is, but I suspect it is Emacs-ish; it was not what I expected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With