" Làm thế nào để tránh bức xúc Entervới getchar()
? "
Trước hết, đầu vào thiết bị đầu cuối thường là dòng hoặc được đệm hoàn toàn. Điều này có nghĩa là hệ thống hoạt động lưu trữ đầu vào thực tế từ thiết bị đầu cuối vào một bộ đệm. Thông thường, bộ đệm này được đưa vào chương trình khi fe \n
được báo hiệu / cung cấp stdin
. Điều này được thực hiện bởi một báo chí Enter.
getchar()
chỉ là ở cuối chuỗi. Nó không có khả năng thực sự ảnh hưởng đến quá trình đệm.
" Làm thế nào tôi có thể làm điều này? "
Bỏ quagetchar()
ngay từ đầu, nếu bạn không muốn sử dụng các lệnh gọi hệ thống cụ thể để thay đổi hành vi của thiết bị đầu cuối một cách rõ ràng như đã giải thích rõ trong các câu trả lời khác.
Rất tiếc là không có chức năng thư viện tiêu chuẩn và không có cách di động nào để xóa bộ đệm khi nhập ký tự đơn. Tuy nhiên, có những giải pháp dựa trên thực thi và không thể di động.
Trong Windows / MS-DOS, có các chức năng getch()
và getche()
hàm trong conio.h
tệp tiêu đề, thực hiện chính xác những gì bạn muốn - đọc một ký tự đơn lẻ mà không cần đợi dòng mới xóa bộ đệm.
Sự khác biệt chính giữa getch()
và getche()
là getch()
không xuất ngay ký tự đầu vào thực tế trong bảng điều khiển, trong khi getche()
đó. Phần bổ sung "e"
là viết tắt của tiếng vang .
Thí dụ:
#include <stdio.h>
#include <conio.h>
int main (void)
{
int c;
while ((c = getche()) != EOF)
{
if (c == '\n')
{
break;
}
printf("\n");
}
return 0;
}
Trong Linux, một cách để có được chế biến nhân vật trực tiếp và đầu ra là sử dụng cbreak()
và echo()
tùy chọn và getch()
và refresh()
thói quen trong ncurses-thư viện.
Lưu ý rằng bạn cần khởi tạo cái gọi là màn hình tiêu chuẩn với initscr()
và đóng cùng một endwin()
quy trình.
Thí dụ:
#include <stdio.h>
#include <ncurses.h>
int main (void)
{
int c;
cbreak();
echo();
initscr();
while ((c = getch()) != ERR)
{
if (c == '\n')
{
break;
}
printf("\n");
refresh();
}
endwin();
return 0;
}
Lưu ý: Bạn cần gọi trình biên dịch với -lncurses
tùy chọn để trình liên kết có thể tìm kiếm và tìm thấy thư viện ncurses.