[c] 단일 문자 만 읽기 위해 getchar ()로 Enter 키를 누르는 것을 피하는 방법은 무엇입니까?

다음 코드에서 :

으로 Enter입력 한 모든 글자를 인쇄 하려면을 눌러야 하는데이 getchar작업은하고 싶지 않습니다.하고 싶은 것은를 누르지 않고 소개 한 글자를 즉시 ​​반복해서 보는 것 Enter입니다. 예를 들어, 문자 ‘a’를 누르면 옆에 다른 ‘a’가 표시됩니다.

하지만 ‘a’를 눌러도 아무 일도 일어나지 않으면 다른 글자를 쓸 수 있고 다음을 누를 때만 사본이 나타납니다 Enter.

어떻게 할 수 있습니까?

cc -o example example.c컴파일을 위해 Ubuntu 에서 명령을 사용하고 있습니다.



답변

Linux 시스템에서는 stty명령을 사용하여 터미널 동작을 수정할 수 있습니다 . 기본적으로 터미널 Enter은를 누를 때까지 모든 정보를 버퍼링 하고 C 프로그램으로 보내기도합니다.

프로그램 자체에서 동작을 변경하는 빠르고 더럽고 특별히 이식 할 수없는 예제 :

이것은 stty cooked원래 터미널 설정이 무엇인지 확인하는 것이 아니라 프로그램이 종료 될 때 원하는 동작 이라고 가정하기 때문에 실제로 최적이 아닙니다 . 또한 모든 특수 처리가 원시 모드에서 건너 뛰기 때문에 많은 키 시퀀스 (예 : CTRL-C 또는 CTRL-D )가 프로그램에서 명시 적으로 처리하지 않으면 예상대로 작동하지 않습니다.

man stty정확히 달성하려는 것에 따라 터미널 동작을 더 많이 제어 할 수 있습니다 .


답변

이것은 OS에 따라 다르며 UNIX와 같은 환경에있는 경우 ICANON 플래그가 기본적으로 활성화되어 있으므로 입력은 다음 '\n'또는 EOF. 표준 모드를 ​​비활성화하면 즉시 문자를 얻을 수 있습니다. 이것은 다른 플랫폼에서도 가능하지만 직접적인 크로스 플랫폼 솔루션은 없습니다.

편집 : 나는 당신이 우분투를 사용하도록 지정했음을 알았습니다. 어제 비슷한 내용을 게시했지만 이로 인해 터미널의 많은 기본 동작이 비활성화됩니다.

모든 캐릭터가 두 번 나타납니다. 이것은 입력이 즉시 터미널로 다시 에코되고 프로그램이 다시 입력하기 때문 putchar()입니다. 출력에서 입력을 연결 해제하려면 ECHO 플래그도 설정해야합니다. 적절한 줄을 다음과 같이 변경하면됩니다.


답변

getchar ()는 많은 플랫폼에서 Enter 키를 눌러 입력해야하는 표준 함수입니다. 플랫폼은 해당 키를 누를 때까지 입력을 버퍼링하기 때문입니다. 많은 컴파일러 / 플랫폼은 ENTER를 신경 쓰지 않는 비표준 getch ()를 지원합니다 (플랫폼 버퍼링을 우회하고 ENTER를 다른 키처럼 취급합니다).


답변

I / O는 운영 체제 기능입니다. 대부분의 경우 운영 체제는 Enter 키를 누를 때까지 입력 한 문자를 프로그램에 전달하지 않습니다. 이를 통해 사용자는 입력을 프로그램으로 보내기 전에 백 스페이스 및 재 입력과 같은 입력을 수정할 수 있습니다. 대부분의 경우 이것은 잘 작동하고 사용자에게 일관된 인터페이스를 제공하며 프로그램이이를 처리하지 않아도됩니다. 어떤 경우에는 프로그램이 키를 누를 때 키에서 문자를 가져 오는 것이 바람직합니다.

C 라이브러리 자체는 파일을 처리하며 데이터가 입력 파일에 들어가는 방식에는 관심이 없습니다. 따라서 언어 자체에서 키를 누를 때 얻을 수있는 방법은 없습니다. 대신 이것은 플랫폼에 따라 다릅니다. OS 나 컴파일러를 지정하지 않으 셨기 때문에 찾아 드릴 수 없습니다.

또한 표준 출력은 일반적으로 효율성을 위해 버퍼링됩니다. 이것은 C 라이브러리에 의해 수행되므로 fflush(stdout);각 문자가 작성된 후에 C 솔루션이 있습니다. 그 후 문자가 즉시 표시되는지 여부는 운영 체제에 달려 있지만 내가 익숙한 모든 OS가 즉시 출력을 표시하므로 일반적으로 문제가되지 않습니다.


답변

나는 Lucas 대답을 좋아하지만 조금 더 자세히 설명하고 싶습니다. man이 다음과 같이 설명 하는 termios.hnamed 에 내장 함수가 있습니다.cfmakeraw()

이것은 기본적으로 Lucas가 제안한 것과 동일하며, man 페이지에서 설정 한 정확한 플래그를 볼 수 있습니다. termios (3) .

사용 사례


답변

Unix 파생물 (Ubuntu)에서 작업하고 있기 때문에 여기에 한 가지 방법이 있습니다. 권장되지는 않지만 작동합니다 (명령을 정확하게 입력 할 수있는 한).

지루할 때 인터럽트를 사용하여 프로그램을 중지하십시오.

  • ‘echo’줄은 현재 터미널 설정을 복원 할 쉘 스크립트로 저장합니다.
  • ‘stty’줄은 대부분의 특수 처리를 끄고 ( Control-D예를 들어 효과가 없음) 문자를 사용할 수있는 즉시 프로그램에 보냅니다. 더 이상 타이핑을 편집 할 수 없음을 의미합니다.
  • ‘sh’줄은 원래 터미널 설정을 복원합니다.

‘stty sane’이 목적에 맞게 설정을 충분히 정확하게 복원하면 절약 할 수 있습니다. ‘-g’형식은 ‘stty’버전간에 이식 할 수 없지만 (따라서 Solaris 10에서 생성 된 것은 Linux에서 작동하지 않거나 그 반대의 경우도 마찬가지 임) 개념은 모든 곳에서 작동합니다. ‘stty sane’옵션은 보편적으로 사용할 수없는 AFAIK (그러나 Linux에 있음)입니다.


답변

‘ncurses’라이브러리를 포함하고 getch()대신 getchar().