개요
이스케이프 시퀀스(escape sequence) 는 \
로 시작하는 두 개 이상의 문자로 구성된 문자열입니다. 문자 또는 문자열 내부에서 사용되는데, 이스케이프 문자(\
)와 조합하여 직접 나타내기 힘든 특수한 기능들을 표현내는데 사용합니다.
C/C++
,JAVA
, C#
등 에서 사용합니다.
예를 들어, \n
은 \
과 n
각각으로 인식되지 않고, 줄바꿈을 의미하는 하나의 문자로 해석됩니다.
우리가 자주쓰는 간단한 줄 바꿈 및 들여쓰기(\t
) 외에도 리눅스 환경에서 이를 이용하여 화면에 프로그램의 수행결과 및 진행상태를 표시할 때 사용할 수 있는 유용한 기능들이 많이 있어 이를 정리 및 기록합니다.
※ 일러두기 리눅스 환경에서 gcc 를 이용하여 컴파일하여 동작을 시험해보았습니다.
커서 이동하기
화면에 고정된 위치에 내용을 바꾸어 가면서 표시할 수 있습니다.
한줄의 내용을 동일한 자리에 출력한다면 다음과 같이 \r
을 사용하여 간단히 제어할 수 있습니다.
#include <stdio.h>
#include <unistd.h>
int main() {
int i;
for (i=10;i>=0;i--) {
printf ("Count Down : %02d\r", i);
fflush(stdout);
sleep(1); // 육안 확인 위해 추가
}
}
실행결과는 다음과 같습니다.
▼ 제자리에 숫자 변경하여 출력하기
하지만 여러줄의 메시지를 표시한다면 조금 복잡합니다. 커서의 위치를 이동하하여 문자를 출력하도록 합니다. 이 때 커서의 이동은 escape sequence 를 사용합니다. 다음의 cursor 제어와 관련된 escape sequence 를 참고합니다.
▼ Escape Sequence (Cursor 이동부분) [출처 : ASCII 테이블]
예를 들어, 아래의 코드는 우선 There
라는 문장을 출력한 후, 그 전줄로 이동하여 Hello
를 출력합니다.
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf ("\n"); // Hello 문장 출력을 위해 빈공간 삽입
printf ("There\n");
printf ("\x1b[%dA", 2); // 2줄위로 이동
sleep(1); // 육안으로 변경내용 확인 위해 추가
printf ("Hello\n");
printf ("\x1b[%dB", 2); // 원래위치(2줄 아래)로 이동(==\n\n 과 같음)
return 0;
}
▼ 실행화면 1. (최초)
▼ 실행화면 2. (1초후)
화면 갱신하기
위와 같이 커서의 이동을 이용하여, 프로그램의 진행상황을 막대그래프로 표시하는 기능을 만들어 보았습니다.
#include <stdio.h>
#include <unistd.h>
int main() {
int i, j;
for (i=0;i<=100;i+=10) {
printf ("%03d %% Process Complete\n", i);
for (j=0;j<i;j++) {
printf ("*");
}
printf ("\x1b[%dA\r", 1); // 1줄위로, 해당줄의 가장왼쪽으로(\r)
fflush(stdout);
sleep(1); // 육안확인
}
printf ("\n\n"); // 원래위치(2줄 아래)로 이동
}
실행 결과는 다음과 같습니다. 동일한 자리에 내용을 덮어씌움으로써 값이 갱신되는 것으로 표시됩니다.
▼ 진행상태 표시 코드 실행화면
※ fflush
를 사용하여 화면에 출력되는 내용이 즉시 반영되도록 해야합니다.
※ cursor를 이동하는 동작을 수행한 후에는 원래 자리로 복원시키는 부분을 꼭 넣어 주어야 합니다. 그렇지 않을 경우, 다른 메시지가 해당자리에 덮어씌워질 수 있습니다.
※ 내용의 오류 및 문의사항은 댓글을 통해 알려주시면 확인하겠습니다.
참고
'프로그래밍 언어 > C' 카테고리의 다른 글
[C] realpath (0) | 2021.05.28 |
---|---|
엔디언 (Endian) - 64 비트 자료형 처리 (0) | 2019.06.01 |
비트단위 연산과 비트 필드 (0) | 2019.04.01 |
콘솔 다루기 (Escape Sequence) @ C (2/2) (0) | 2018.11.26 |