Đây là câu hỏi C rất cơ bản, đến từ trang 18 của Kernighan và Ritchie.Tại sao không getchar() đọc các ký tự như backspace?
tôi đã biên soạn mã rất đơn giản này cho đếm ký tự đầu vào từ bàn phím:
#include <stdio.h>
/* count characters in input; 1st version */
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%1d\n", nc);
}
này biên dịch tốt, chạy tốt, và hoạt động khá nhiều như mong đợi tức là nếu tôi nhập "Hello World", nó trả về giá trị 11 khi tôi nhấn CTRLD để cung cấp ký tự EOF.
Điều gây nhầm lẫn là nếu tôi phạm sai lầm, tôi có thể sử dụng backspace để xóa ký tự và nhập lại chúng, và nó chỉ trả về số ký tự được hiển thị bởi terminal khi tôi gọi EOF.
Nếu mã đang đếm từng ký tự, bao gồm ký tự đặc biệt, nếu tôi nhập bốn ký tự, xóa hai ký tự và nhập hai ký tự khác, không được xuất với 8 ký tự (4 char + 2 del + 2 char) 4?
Tôi rõ ràng là sự hiểu lầm cách C xử lý backspace và cách/khi mã tăng biến nc
?
Việc chỉnh sửa được xử lý bởi ứng dụng đầu cuối, do đó, 'getchar' không bao giờ đọc xóa. –
Lưu ý: Bạn nên sử dụng 'int main (void)' thay cho 'main()' như trước đây là giá trị hợp lệ theo tiêu chuẩn. –
@CoolGuy: Trên thực tế, phiên bản thứ hai vẫn hợp lệ, nhưng là một di sản. Đó là một tính năng lỗi thời và có thể bị loại bỏ khỏi tiêu chuẩn. Nói rằng: có, phiên bản đầu tiên chắc chắn nên được sử dụng. Nói chung, các chữ ký kiểu mẫu nguyên mẫu nên được sử dụng cho các chức năng nói chung. – Olaf