2008-11-06 60 views
10

Tôi đang sử dụng getch() và ứng dụng của tôi gặp sự cố ngay lập tức. Kể cả khi thực hiện:Tương đương với Windows getch() cho Mac/Linux treo

int main() 
{ 
    getch(); 
} 

tôi không thể tìm thấy liên kết nhưng được cho là vấn đề là nó cần phải tắt bộ đệm hoặc một cái gì đó kỳ lạ cùng những đường nét, và tôi vẫn muốn cout để làm việc cùng với mã đa nền tảng.

Tôi được yêu cầu sử dụng std::cin.get(), nhưng tôi muốn ứng dụng thoát khi nhấn một phím, không phải khi người dùng nhập vào một chữ cái hoặc số rồi nhấn enter để thoát.

Có chức năng nào cho điều này không? Mã phải hoạt động trong Mac (os của tôi) và Windows.


Liên kết/biên dịch không phải là issue; Tôi bao gồm <curses.h> và liên kết với -lcurses trong XCode, trong khi Windows sử dụng <conio.h>.

+0

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. –

Trả lời

11

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.

2

Bạn chưa trưng bày một dòng

#include <stdio.h> 

hoặc

#include <curses.h> 

hoặc tương đương. Bạn có chắc chắn rằng bạn đang liên kết với thư viện mà bao gồmgetch()?

+0

liên kết/biên dịch không phải là một vấn đề, tôi bao gồm các lời nguyền và làm -lcurses trong xcode. cửa sổ sử dụng conio.h –

-1

Chức năng getch không khả dụng trên các hệ thống giống Unix, nhưng bạn có thể thay thế nó bằng các lệnh điều khiển thông qua trình biên dịch của bạn với hàm system.

Cách sử dụng:

Trong Windows bạn có thể sử dụng system("pause");

Trong các hệ thống Unix-like (như OSX), bạn có thể sử dụng system("read -n1 -p ' ' key");

Lưu ý: system được khai báo trong <stdlib.h>.

+0

điều này sẽ tạm dừng chương trình của bạn cho đến khi người dùng nhấn một khóa-phím-giống như trong 'getch(); ' – David

+3

Vui lòng không đề xuất các lệnh' system() '. Đó là thực hành lập trình kém và có tác dụng phụ xấu. – user2064000

0

Sử dụng cin.get() chức năng ví dụ:

#include <iostream> 

using namespace std; 

int main() 
{ 
    char input = cin.get(); 

    cout << "You Pressed: " << input; 
} 

Chương trình sau đó sẽ chờ đợi cho bạn để nhấn một phím.

Khi bạn có, phím bạn nhấn sẽ được in lên màn hình.

+0

Hoặc chỉ sử dụng hàm getchar() – Benjamin

Các vấn đề liên quan