Es necesario colocar entre paréntesis como:
while((ch = getchar()) != '\n')
Precedence de !=
es mayor que la de =
while(ch = getchar() != '\n')
es igual a:
while(ch = (getchar() != '\n'))
que dice un char se compara con nueva línea y luego asigna el resultado de la comparación a ch. Ahora bien, el resultado de la comparación es 0
(cuando se introduce nueva línea) o 1
(cuando se introduce cualquier otra cosa)
El carbón raro que se está viendo es la control char con valor 1
, no hay ningún símbolo ASCII imprimible para 1, por lo Supongo que es el caparazón que imprime el raro char con el valor 0001
en él.
Puede confirmarlo mediante la canalización de su salida del programa de volcado octal (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 cuando se utiliza con -Wall
se advierte que:
warning: suggest parentheses around assignment used as truth value
Si estaba utilizando gcc, asegúrese de que tiene establecido el indicador de -Wall. Entre los muchos problemas comunes que informa es este. – JeremyP