[C/C++] C에서 Enter 없이 키 입력 처리하기: getch와 termios로 구현

[C/C++] C에서 Enter 없이 키 입력 처리하기: getch와 termios로 구현

C
민호이 민호이 2025. 1. 25. 01:47
목차
  1. 1. 문제 개요
  2. 2. Windows에서 getch 함수 사용
  3. 예제 코드:
  4. 출력 예시:
  5. 장점:
  6. 단점:
  7. 3. Linux에서 termios를 사용한 구현
  8. 출력 예시:
  9. 장점:
  10. 단점:
  11. 4. getch와 termios 비교
  12. 5. 실전 팁: 플랫폼 독립적인 구현
  13. 예제 코드:
  14. 6. 결론

C에서 Enter 없이 키 입력 처리하기: getch와 termios로 구현

1. 문제 개요

일반적으로 C 프로그램은 표준 입력에서 데이터를 받을 때 Enter 키 입력을 필요로 합니다. 하지만 게임 개발이나 실시간 입력 처리가 필요한 경우, Enter 키를 기다리지 않고 사용자 입력을 즉시 처리해야 할 때가 있습니다. 이번 글에서는 Windows와 Linux 환경에서 Enter 키 없이 한 글자를 입력받는 방법을 설명합니다.


2. Windows에서 getch 함수 사용

Windows 환경에서는 <conio.h> 라이브러리에 포함된 _getch() 함수로 간단하게 구현할 수 있습니다. 이 함수는 Enter 키를 누를 필요 없이 입력된 키를 즉시 반환하며, 입력된 키를 화면에 출력하지 않습니다.

예제 코드:

#include <conio.h>
#include <stdio.h>
int main() {
printf("Press any key: ");
char ch = _getch(); // Enter 없이 입력받기
printf("\nYou pressed: %c\n", ch);
return 0;
}

출력 예시:

Press any key: [사용자가 A를 입력]
You pressed: A

장점:

  • 구현이 간단하며 추가 설정이 필요 없음.
  • 키보드 입력을 화면에 출력하지 않아 게임 등에서 유용.

단점:

  • Windows 전용으로, 다른 플랫폼에서는 사용할 수 없음.

3. Linux에서 termios를 사용한 구현

Linux에서는 기본적으로 표준 입력이 **캐논 모드(canonical mode)**로 작동하며, Enter 키 입력 후에 데이터를 처리합니다. 이를 해결하기 위해, termios 라이브러리를 사용하여 캐논 모드를 비활성화하고 즉시 입력 처리를 활성화할 수 있습니다.

예제 코드:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
char getch() {
char buf = 0;
struct termios old = {0};
// 기존 터미널 설정 저장
if (tcgetattr(STDIN_FILENO, &old) < 0)
perror("tcgetattr");
// 캐논 모드 및 에코 비활성화
old.c_lflag &= ~ICANON; // 캐논 모드 비활성화
old.c_lflag &= ~ECHO; // 에코 비활성화
old.c_cc[VMIN] = 1; // 최소 1바이트 입력 대기
old.c_cc[VTIME] = 0; // 입력 대기 시간 설정
if (tcsetattr(STDIN_FILENO, TCSANOW, &old) < 0)
perror("tcsetattr");
// 한 글자 읽기
if (read(STDIN_FILENO, &buf, 1) < 0)
perror("read");
// 원래 설정 복구
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
if (tcsetattr(STDIN_FILENO, TCSADRAIN, &old) < 0)
perror("tcsetattr");
return buf;
}
int main() {
printf("Press any key: ");
char ch = getch(); // Enter 없이 입력받기
printf("\nYou pressed: %c\n", ch);
return 0;
}

출력 예시:

Press any key: [사용자가 B를 입력]
You pressed: B

장점:

  • 캐논 모드를 비활성화하여 Enter 없이 입력을 처리 가능.
  • 에코 기능을 끄면 입력 내용이 화면에 표시되지 않아 깔끔한 인터페이스 제공.

단점:

  • 구현이 다소 복잡하며, 시스템 호출에 대한 이해가 필요.
  • 플랫폼에 종속적(Linux/Unix 전용).

4. getch와 termios 비교

항목 Windows (_getch) Linux (termios)
사용 용이성 간단한 구현 설정이 다소 복잡
입력 에코 기본적으로 비활성화 에코 비활성화 설정 필요
플랫폼 의존성 Windows 전용 Linux/Unix 전용
유연성 낮음 높음 (다양한 터미널 설정 가능)

5. 실전 팁: 플랫폼 독립적인 구현

플랫폼 독립적으로 키 입력 처리를 구현하려면, Windows와 Linux에서 각각 다른 함수를 호출하도록 조건부 컴파일을 사용할 수 있습니다.

예제 코드:

#include <stdio.h>
#ifdef _WIN32
#include <conio.h>
char getch() {
return _getch();
}
#else
#include <unistd.h>
#include <termios.h>
char getch() {
char buf = 0;
struct termios old = {0};
tcgetattr(STDIN_FILENO, &old);
old.c_lflag &= ~ICANON;
old.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &old);
read(STDIN_FILENO, &buf, 1);
old.c_lflag |= ICANON;
old.c_lflag |= ECHO;
tcsetattr(STDIN_FILENO, TCSADRAIN, &old);
return buf;
}
#endif
int main() {
printf("Press any key: ");
char ch = getch();
printf("\nYou pressed: %c\n", ch);
return 0;
}

출력 예시:

Press any key: [사용자가 C를 입력]
You pressed: C

6. 결론

  • Windows 환경에서는 _getch()를, Linux 환경에서는 termios를 사용하여 Enter 없이 입력 처리를 구현할 수 있습니다.
  • 플랫폼 독립적인 코드를 작성하려면 조건부 컴파일을 활용하세요.
  • 실시간 입력 처리가 필요한 게임 개발이나 터미널 응용 프로그램에 유용합니다.

이제 Enter 키 없이 입력받는 C 코드를 작성하는 데 필요한 모든 정보를 알게 되셨습니다!

 

저작자표시 비영리 변경금지 (새창열림)
  1. 1. 문제 개요
  2. 2. Windows에서 getch 함수 사용
  3. 예제 코드:
  4. 출력 예시:
  5. 장점:
  6. 단점:
  7. 3. Linux에서 termios를 사용한 구현
  8. 출력 예시:
  9. 장점:
  10. 단점:
  11. 4. getch와 termios 비교
  12. 5. 실전 팁: 플랫폼 독립적인 구현
  13. 예제 코드:
  14. 6. 결론
'C' 카테고리의 다른 글
  • [C/C++] C언어에서 배열을 빠르고 효율적으로 초기화하는 다양한 방법
  • [C/C++] C++에서 CPU 사이클 카운트 측정: __rdtsc와 플랫폼별 구현법
  • [C/C++] C 언어에서 공백을 포함한 문자열 입력 받기: 'scanf'와 'fgets' 활용법
  • [C/C++] C에서 다차원 배열을 동적으로 할당하는 올바른 방법
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 유클리드 호제법
  • 최대공약수
  • 수학
  • 코드업
  • C
  • 알고리즘
  • 최소공배수
  • c++

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[C/C++] C에서 Enter 없이 키 입력 처리하기: getch와 termios로 구현
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.