conio.h에서 getch()와 같은 LF를 기다리지 않고 키보드에서 키를 읽는 일부 기능을 찾기 위해 인터넷을 통해 찾고 있습니다. 불행히도 스위치 -ansi와 -pedantic을 사용하여 gcc로 컴파일해야하는데 getch()는 쓸모가 없다. 아마 표준과 일치하는 다른 기능을 아십니까?LF를 기다리지 않고 키를 읽을 수있는 기능
답변
표준 setvbuf
기능을 사용하여 버퍼링을 비활성화 할 수 있습니다 (아래 예 참조). 이렇게하면 프로그램의 관점에서 버퍼링이 비활성화되지만 터미널에서 버퍼링이 비활성화되지는 않습니다 (원하는 것일 수도 있음). 예제 코드 :
#include <stdio.h>
int main()
{
char c;
setvbuf(stdin, 0, _IONBF, 0);
c = getc(stdin);
printf("read %c\n", c);
return 0;
}
이런 식으로 실행 여전히 터미널 라인 현명한로부터 입력을 읽을 수는 있지만 첫 번째 문자가 입력 소모됩니다
$ ./buf
ab
read a
$ b
을 입력의 전체 라인을 일으킬 것 setvbuf
라인을 제거 귀하의 프로그램에 의해 소비됩니다.
터미널에 대해 모르기 때문에 C 표준 라이브러리 만 사용하는 경우 터미널의 회선 버퍼링을 사용하지 않도록 설정하는 이식성이 없습니다.
편집 : 당신이 필요하지 getchar``
#include <stdio.h>
#include <unistd.h> /* for STDIN_FILENO */
#include <termios.h>
int main()
{
char c;
struct termios old, t;
tcgetattr(STDIN_FILENO, &old);
t = old;
cfmakeraw(&t);
tcsetattr(STDIN_FILENO, TCSANOW, &t);
c = getc(stdin);
tcsetattr(STDIN_FILENO, TCSANOW, &old);
printf("\rread %c\n", c);
return 0;
}
Nah, 불행히도 나를 만족시키지 못합니다. 나는 여전히 프로그램에서 더 나아가려면 _enter_ key (LF 문자 보내기)를 눌러야합니다. 가능하지 않니? 나를 위해 슬픈. 그런 다음 프로그램이 즉시 키를 치는 것에 응답하는 게임 (뱀처럼)을 작성하는 방법 (컴파일 설정 사용)이 있는지 궁금합니다 ... – Sushi271
순수 C를 사용하면 간단합니다. 불가능합니다. 당신은 원시 모드 (POSIX의 경우'man termios'를 보시오) 나 더 나은, [ncurses] (http : // www. –
좋아, 나는 이미이 방향으로 훨씬 더 많은 것을했다. 나는 termios 구조체의 전체 명세를 찾았다. 심지어 내 언어로도 :) 그리고 내가 꺼야하는 플래그들 (ECHO & ICANON). 그리고 "EDIT"에 대해서도 감사드립니다. 그냥 조금 더 달라, 조금 다르지만 작은 것을 말해줘. (비록 쉬운 것 같지만) : 어떤 문자가 입력 버퍼 (또는 얼마나 많이)에서 기다리고 있는지 어떻게 알 수 있습니까? – Sushi271
합니까 : 당신이 원하는 것은 termios의 기능을 사용하는 일을
한 POSIX 휴대용 방법은? –
이 작업을 수행하는 이식성있는 방법은 없습니다. 각 OS에 대해 독자적인 "휴대용"래퍼를 만듭니다. – Mehrdad
'getchar()'을 사용하여 간단한 프로그램을 작성 했으므로 여전히 LF를 기다리고 있습니다. 왜 이렇게 어려운가요? 버퍼에서 한 캐릭터를 가져 오는 것이 그렇게 힘들었습니까? LF 캐릭터 이후에 모든 것을 가져가는 것보다 더 어려운가? – Sushi271