본문 바로가기
프로그래밍/C

C/C++ ] ANSI 이스케이프 코드 시퀀스 사용해서 커서 이동 + 터미널 조작하기

by eteo 2023. 12. 11.

 

 

C/C++ 콘솔 프로그램에서 ANSI 이스케이프 시퀀스 명령어를 사용하여 콘솔 커서 이동 등 터미널을 조작할 수 있다.

 

 

 

 

1. 이스케이스 시퀀스 시작 : \x1B[ 또는 \033[를 사용하여 ANSI 이스케이프 시퀀스를 시작한다. 아래서는 \x1B[ 기준으로 설명한다.

 

 

2. 커서 이동

  • 커서를 위로 이동 : \x1B[A, \x1B[A 또는 \x1B[1A 는 위로 한칸 이동하고 \x1B[2A 는 위로 두칸 이동한다.
  • 커서를 아래로 이동 : \x1B[B
  • 커서를 오른쪽으로 이동 : \x1B[C
  • 커서를 왼쪽으로 이동 : \x1B[D
  • 특정 위치로 커서 이동 : \x1B[<row>;<col>H, row는 행번호 col은 열번호로  \x1B[0;0H 또는 \x1B[1;1H 는 화면의 좌측 상단 첫번째 칸으로 이동한다.

 

 

3. 커서 숨기기/보이기

  • 커서 숨기기 : \x1B[?25l
  • 커서 보이기 : \x1B[?25h

 

 

4. 화면 지우기

  • 현재 위치부터 끝까지 화면 지우기 : \x1B[J
  • 시작부터 현재 위치까지 화면 지우기 : \x1B[1J
  • 전체 화면 지우기 : \x1B[2J

 

 

5. 텍스트 색상 변경 : \x1B[38;5;<color>m, 여기서 color는 색상 코드이다.

 

 

6. 배경 색상 변경 : \x1B[48;5;m

 

 

7. 기본 색상 복원 : \x1B[0m, 기본 텍스트 및 배경 색상으로 돌아감

 

 

 

https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797

 

ANSI Escape Codes

ANSI Escape Codes. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

 

 

 

사용 예시. 

 

#include <stdio.h>
#include <string.h>

int main(void)
{
	char buf[30];
	printf("\x1B[38;5;82m");
	printf("=====================================\n");
	printf("|     당신의 이름을 입력하세요.     |\n");
	printf("|     이름 :                        |\n");
	printf("=====================================");
	printf("\x1B[1A\x1B[24D");
	fgets(buf, sizeof(buf), stdin);
	buf[strcspn(buf, "\n")] = '\0';
	printf("\x1B[2J\x1B[0;0H");
	printf("\x1B[38;5;226m");
	printf("=====================================\n");
	printf("|     당신의 이름은 바로!           |\n");
	printf("|     이름 : %-22s |\n", buf);
	printf("=====================================");
	printf("\x1B[38;5;0m");
	return 0;
}

 

 

 

 

 

근데 사실 윈도우 콘솔창에서 이동할 때는 windows.h 헤더 파일을 포함한 다음에 SetConsoleCursorPosition 함수를 사용하는 편이 낫긴하다.

 

void gotoXY(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}