2012-07-08 16 views
5

Tôi có một chương trình ncurses đơn giản được thiết lập để đọc từng ký tự một lần với getch() và sao chép chúng vào bộ đệm. Vấn đề tôi đang gặp là phát hiện một phím bấm của phím xóa lùi. Đây là mã có liên quan:Sử dụng backspace với ncurses

while((buffer[i] = c = getch()) != EOF) { 
    ++i; 
    if (c == '\n') { 
     break; 
    } 
    else if (c == KEY_BACKSPACE || c == KEY_DC || c == 127) { 
     i--; 
     delch(); 
     buffer[i] = 0; 
    } 
    refresh(); 
} 

Nhưng khi cố gắng chạy mã này, đây là những gì xuất hiện trên màn hình sau khi cố gắng xóa các ký tự từ dòng "này là một thử nghiệm":

this is a test^?^?^? 

và các nội dung của buffer là:

this is a test 

với gdb tôi biết rằng câu lệnh if kiểm tra cho một xóa/xóa lùi đã được gọi, vì vậy những gì khác tôi cần phải làm như vậy mà tôi có thể xóa cha racters?

+0

'Đây có phải là nội dung thử nghiệm ^? ^? ^? 'Nội dung của' bộ đệm', hay nó xuất hiện trên màn hình? Dù bằng cách nào, khác là gì? –

+0

'đây là một thử nghiệm ^? ^? ^?' Là những gì xuất hiện trên thiết bị đầu cuối, bộ đệm chứa 'đây là một thử nghiệm'. – Jumhyn

Trả lời

4

Có vẻ như ^? là nội dung được lặp lại với màn hình khi bạn nhập ký tự DEL.

Có thể bạn có thể gọi delch() hai lần, nhưng sau đó bạn phải tìm ra ký tự nào lặp lại thành chuỗi gồm hai ký tự (hoặc nhiều hơn).

Đặt cược tốt nhất của bạn có thể gọi là noecho() và tự in chính các ký tự đó.

+0

Điều đó làm việc hoàn hảo, nó thực sự làm cho mã của tôi một chút sạch hơn là tốt. Ngoài ra, tôi đã phải giảm 'i' xuống 2, vì tôi đang tăng nó trước khi kiểm tra một backspace. Cảm ơn! :) – Jumhyn