그래서 기본적으로 문자 입력을 읽고 'q'가 입력 될 때까지 인쇄합니다.termios.h를 사용하여 C 프로그램에서 사용자가 입력을 요청할 때 화살표 키와 백 스페이스를 올바르게 작동시키는 방법은 무엇입니까?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<termios.h>
int main(void) {
char c;
static struct termios oldtio, newtio;
tcgetattr(0, &oldtio);
newtio = oldtio;
newtio.c_lflag &= ~ICANON;
newtio.c_lflag &= ~ECHO;
tcsetattr(0, TCSANOW, &newtio);
printf("Give text: ");
fflush(stdout);
while (1) {
read(0, &c, 1);
printf("%c", c);
fflush(stdout);
if (c == 'q') { break; }
}
printf("\n");
tcsetattr(0, TCSANOW, &oldtio);
return 0;
}
주 기능 시작 부분에서 사용자가 입력 할 때 입력을 볼 수 있도록 표준 모드를 해제합니다. 나는 또한 에코를 꺼서 "^ [[A]는 예를 들어 위쪽 화살표 키를 누를 때 팝업되지 않습니다. 이 작동하지만 터미널 창에서 커서를 위쪽 행으로 이동할 수 있으며 좋지 않습니다. 사용자가 현재 행 내에서만 이동할 수 있도록 수정하는 방법이 있습니까?
또 다른 문제는 백 스페이스입니다. 내가 그것을 누르면 커서의 현재 위치에 남아있는 문자를 지우는 대신 이상한 심볼 (0x7f라고 가정)을 인쇄합니다. 난 propably 어떻게 든 프로그램에서 백 스페이스 키 출력을 처리해야하지만이 이상한 16 진수 이후로 그것을 어떻게 해야할지 모르겠다. 이것에 대한 조언?
이 작업을하기 위해 생각한 한 가지 옵션은 표준 모드를 사용하여 화살표 키와 백스 페이스 기능이 자동으로 사용되도록하는 것입니다. 그러나 정식 모드는 줄 단위로 작동하므로 사용자가 "Enter"를 누르기 전까지는 텍스트가 표시되지 않습니다. 지금까지 입력하는 동안 사용자가 입력 내용을 볼 수있는 방법을 찾지 못했습니다. 이것은 가능한가?
그리고 제발 ncurses 또는 readline 제안. termios.h를 사용하여이 작업을 수행하려고합니다.
에코를 끄고 모든 것을 직접 에코합니다. 그것은 성공적인 전략이 아닙니다. 인쇄 가능한 일반 문자를 반향하고 제어 재봉을 처리하고 해석합니다. 당신은 당신의 통제 순서가 무엇이고 이것이 의미하는 바를 알아야합니다. 이를 위해서는 terminfo 데이터베이스와 동등한 것이 필요합니다. terminfo는 ncurses와 밀접하게 연결되어 있으므로 ncurses는 필요 없으며, 나는 여러분에게 행운을 빌어줍니다. –
너는 ncurses가 없어도 이것이 가능하지 않다는 것을 말하는거야? – JZ555
처음부터 모든 부분을 다시 구현하고 다른 부분에 기능을 포기하지 않으려는 경우 모든 것이 전부없이 모든 것이 가능합니다. 인기있는 터미널 제품군 중 하나 인 VT100 및 자손에 자신을 제한하고 자신의 제어 시퀀스 목록을 컴파일 한 다음이를 사용하여 작업 할 수 있습니다. 그렇지 않으면 적어도 terminfo (기술적으로는 (n)의 일부)를 사용해야합니다. –