è necessario inserire le parentesi come:
while((ch = getchar()) != '\n')
Precedence di !=
è maggiore di quella di =
while(ch = getchar() != '\n')
è lo stesso:
while(ch = (getchar() != '\n'))
che legge un confronto di caratteri con newline e quindi assegna il risultato del confronto a ch. Ora il risultato del confronto è 0
(quando viene immesso nuova riga) o 1
(quando si entra qualsiasi altra cosa)
Il carattere strano che stai vedendo è la control char con valore di 1
, non c'è nessun simbolo stampabile per ASCII 1, in modo da Immagino sia il guscio che stampa il carattere strano con il valore 0001
in esso.
È possibile confermare che convogliando l'output del programma a discarica ottale (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 quando viene utilizzato con -Wall
si avverte come:
warning: suggest parentheses around assignment used as truth value
Se si utilizza gcc, assicurarsi di disporre del set di flag di -Wall. Tra i molti problemi comuni che riporta è questo. – JeremyP