Bạn cần phải đặt dấu ngoặc đơn như:
while((ch = getchar()) != '\n')
Precedence của !=
là lớn hơn so với =
while(ch = getchar() != '\n')
là giống như:
while(ch = (getchar() != '\n'))
đọc lần so sánh chữ cái nó với newline và sau đó gán kết quả so sánh với ch. Bây giờ kết quả so sánh là 0
(khi xuống dòng được nhập) hoặc 1
(khi bất cứ điều gì khác được nhập)
Các char lạ bạn đang nhìn thấy là control char với giá trị 1
, không có biểu tượng in cho ASCII 1, vì vậy Tôi đoán vỏ của nó in char lạ với giá trị 0001
trong đó.
Bạn có thể xác nhận nó bằng đường ống đầu ra chương trình của bạn để bãi bát phân (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 khi được sử dụng với -Wall
cảnh báo bạn như:
warning: suggest parentheses around assignment used as truth value
Nếu bạn đang sử dụng gcc, hãy đảm bảo bạn đã đặt cờ -Wall. Trong số rất nhiều vấn đề thường gặp, báo cáo là vấn đề này. – JeremyP