Вам нужно поставить круглые скобки как:
while( (ch = getchar()) != '\n')
Старшинство из !=
больше, чем =
while( ch = getchar() != '\n')
совпадает с:
while( ch = (getchar() != '\n') )
, который читает символ, сравнивает его с символом новой строки и затем присваивает результат сравнения ch. Теперь результат сравнения равен 0
(при вводе новой строки) или 1
(при вводе чего-либо еще)
Странный символ, который вы видите, это контрольный символ со значением 1
, для ASCII 1 нет печатаемого символа, поэтому я предполагаю, что это оболочка, которая печатает странный символ со значением 0001
в нем.
Вы можете подтвердить это, отправив вывод вашей программы в восьмеричный дамп (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 при использовании с -Wall
предупреждает вас как:
warning: suggest parentheses around assignment used as truth value