Bạn đã xem <curses.h>
để xem chức năng getch()
có hoạt động không?
Gợi ý: OSX và Linux không giống với Windows.
Cụ thể, như một macro trong <curses.h>
, chúng ta thấy:
#define getch() wgetch(stdscr)
Bây giờ, có xuất hiện, trên hệ thống của bạn, trở thành một chức năng thực tế getch()
trong thư viện lời nguyền, nhưng nó hy vọng stdscr
được thiết lập , và điều đó được thực hiện bởi các hàm khởi tạo lời nguyền (initscr()
và người thân), và điều đó không được thực hiện bởi mã của bạn. Vì vậy, mã của bạn đang gọi hành vi không xác định bằng cách gọi các thói quen curses trước khi khởi tạo chính xác được thực hiện, dẫn đến sự cố.
(Tốt gợi ý từ dmckee - nó giúp có được những dòng liên kết ra khỏi acidzombie24, đó là quan trọng.)
Để có được đến một điểm mà một key-đột quỵ duy nhất có thể được đọc và chương trình chấm dứt sạch, bạn phải làm rất nhiều công việc trên Unix (OSX, Linux). Bạn sẽ phải bẫy trạng thái ban đầu của thiết bị đầu cuối, sắp xếp chức năng atexit()
- hoặc một số cơ chế tương tự - để khôi phục trạng thái của thiết bị đầu cuối, thay đổi thiết bị đầu cuối từ chế độ nấu sang chế độ thô, sau đó gọi hàm để đọc ký tự (có thể chỉ read(0, &c, 1)
) và thực hiện lối ra của bạn. Có thể có những cách khác để làm điều đó - nhưng nó chắc chắn sẽ liên quan đến một số hoạt động thiết lập và teardown.
Một cuốn sách có thể giúp ích là Advanced Unix Programming, 2nd Edn bởi Mark Rochkind; nó bao gồm xử lý thiết bị đầu cuối ở mức cần thiết. Ngoài ra, bạn có thể sử dụng <curses.h>
đúng cách - điều đó sẽ đơn giản hơn giải pháp cuộn của riêng bạn và có thể đáng tin cậy hơn.
Nguồn
2008-11-06 01:13:17
Lưu ý rằng 'cout' là cấu trúc C++. Mặc dù câu trả lời cho đến nay chủ yếu cho C, chúng cũng sẽ áp dụng cho C++. Và std :: cin.get() sẽ bị mắc kẹt chờ đợi một dòng đầu vào đầu cuối - hội chứng 'Lượt truy cập' - cũng giống như hàm getchar() hoặc bất kỳ hàm I/O chuẩn nào khác. –