Sie müssen Klammern setzen wie:
while((ch = getchar()) != '\n')
Precedence von !=
ist größer als die der =
while(ch = getchar() != '\n')
ist die gleiche wie:
while(ch = (getchar() != '\n'))
die liest ein Char vergleicht es mit Newline und dann weist das Ergebnis des Vergleichs zu ch. Nun das Ergebnis des Vergleichs ist 0
(wenn Newline eingegeben) oder 1
(wenn nichts anderes angegeben ist)
Die seltsamen Zeichen sind Sie zu sehen sind die control char mit Wert 1
, gibt es keine druckbaren Zeichen für ASCII 1, so Ich denke, es ist die Shell, die das komische Zeichen mit dem Wert 0001
darin druckt.
Sie können es bestätigen, indem Sie Ihre Programmausgabe zu Oktal-Dump kochend (od):
$ echo 'a' | ./a.out | od -bc # user entered 'a'
0000000 122 145 141 144 040 001 012
R e a d 001 \n
here you go ----------------^
$ echo '\n' | ./a.out | od -bc # user entered '\n'
0000000
GCC, wenn sie mit -Wall
verwendet warnt Sie, wie:
warning: suggest parentheses around assignment used as truth value
Wenn Sie gcc verwendet haben, stellen Sie sicher, dass Sie das Flag -Wall gesetzt haben. Unter den vielen häufigen Problemen, die es berichtet, ist dieser. – JeremyP