[C 언어의 기초] 데이터형과 선언 - 4부







확장 문자(ESC)



ASCII 코드 중에서 0x20미만의 코드는 표시가 불가능한 문자이다. 이들 코드를 문자로표시하기 위해서 확장 문자(ESC)를 사용한다. 확장문자는 "\" (back slash) 다음에 1 문자로 표시하고 표 1에 C 언어의 확장 문자와 ASCII 코드와의 관계를 표시했다.


표 1 C의 확장 문자
확장 문자
ASCII코드
기능
\0
0x00
null
\a
0x07
소리를 낸다
\b
0x08
back space
\f
0x0c
form feed
\n
0x0a
new line
\r
0x0d
carriage return
\t
0x09
tab
\v
0x0b
수직 tab
\\
0x 5c
\ 기호
\'
0x 2c
' 기호
\"
0x 22
" 기호
\?
0x 3F
? 기호

또는 "\"의 뒤에 직접 ASCII 코드 (3자리의 8진수, 또는 3자리의 16진수)를 사용해서 확장 문자를 작성 할 수 있다. \000……000는 3자리의 8진법으로 표시되는 ASCII 코드 \xhhh……hhh는 3자리의 16진법으로 표시되는 ASCII 코드 예를 들면, \x00a 는 \n 라고 쓰는 것과 같은 의미이다.

확인 문제 1
/* char형 변수를 이용한 탈출 문자의 사용 */
#include <stdio.h>
main( )
{
char beep, new_line, tab;

/* 10진,8진,16진수를 문자형 변수에 대입하여 %c 출력 지정자로 출력 */
beep = 7; tab = 011; new_line = 0x0a;
printf("%c%c%c", beep, new_line, tab);

/* 탈출 문자를 문자형 변수에 대입하여 %c 출력 지정자로 출력 */
beep = '\a'; tab = '\t'; new_line = '\n';
printf("%c%c%c", beep, new_line, tab);

/* 정수형 10진, 8진, 16진수를이용하여 %c 출력 지정자로 출력 */
printf("%c%c%c", 7, 011, 0x0a);
/* 문자형 8진, 16진 상수를 이용하여%c 출력 지정자로 출력 */
printf("%c%c%c", '\007', '\x09', '\x0a');

/* 문자형 8진, 16진 상수 코드 값을 이용하여 그대로 출력 */
printf("\007\x09\x0a");

/* 탈출 문자만을 이용하여 그대로 출력 */
printf("\a\t\n");
}


출력 함수(printf() 함수)에서 탈출 문자를 사용하여 어떤 기능을 실행하는 제어 출력을 실행할 때 탈출 문자를 char형 변수에 대입한 다음에 %c 출력 지정자를 사용하여 출력하거나, 출력 문자열 내부에 직접 탈출 문자를 사용하여 제어 출력을 실행할 수 있지만, 일반적으로 탈출 문자만을 사용하는 것이 더 좋습니다. 그 이유는 다음과 같습니다.

첫째로, 탈출 문자는 컴퓨터에서 사용하는 코드체계에 관계없이 사용할 수 있습니다. 예를 들면, 다음 줄로 커서를 이동시키는 '\n'의 코드 값은 ASCII 코드체계에서 '\x0a'이지만 EBCDIC 코드는 전혀 다른 값을 갖게 됩니다. 

다시 말하면 '\x0a'는 ASCII 코드체계를 사용하는 컴퓨터에서는 사용할 수 있지만 EBCDIC 코드를 사용하는 컴퓨터에서 사용할 수 없는 문제점을 갖고 있습니다. 따라서 어떠한 코드 체계에서나 동일하게 사용되는 탈출 문자를 그대로 사용하는 것이 좋습니다. 즉, 탈출문자 '\n'은 ASC II 코드에서나 EBCDIC 코드에서 모두 줄 바꿈 기능을 실행하는 탈출 문자로 사용됩니다.

둘째로, 탈출 문자에 대응하는 코드 값보다 탈출 문자 그 자체가 외우기도 쉽고 사용이 편합니다. 예를 들면, 벨소리를 울리는 탈출문자는 '\a'이며, 이에 대응하는 ASCII 코드 값은 '\x07'입니다. '\a'와 '\x07' 중에서 어떤 것이 더 사용자에게 친숙하게 사용할 수 있는지 명확하게 구분될 것입니다.

셋째로, 출력 함수의 문자열 내에서는 변수를 이용하여 문자 출력 지정자인 %c를 사용하지 않고 탈출 문자에 대응하는 코드값을 바로 사용할 수 있습니다. 이를 확인하기 위해서 다음의 3개의 printf() 함수를 봅시다.

printf("The code value of Escape characters can't use in string \n");

printf("The code value of Escape characters can't use in string 10 0x0a");

위의 2개의 printf() 함수에서 첫번째 printf() 함수만 줄 바꿈 탈출문자(\n)에 의해서 정상적인 줄 바꿈 기능을 실행합니다. 그러나 탈출문자의 코드 값을 정수형 상수로 사용한 두번째 printf() 함수에서는 줄 바꿈을 실행하는 것이 아니라 10 0x0a 문자열이 그대로 출력될 뿐입니다. 어떤 상황에서 꼭 코드값을 사용하려 한다면 다음과 같이 8진 또는 16진의문자형 상수를 사용해야 합니다.

printf("The code value of Escape characters can't use in string\012 \x0a");

printf("The code value of Escape characters can't use in string%c%c",'\012','\x0a');

위에서 처럼 문자열 내부에 8진과 16진 문자형 상수 값을 인용 부호를 감싸지 않는 상태로 사용하여 줄바꿈을 할 수 있지만, 그러나 다음과 같이 사용할 수는 없습니다.

printf("The code value of Escape characters can't use in string '\012' '\x0a' "); /* 인용 부호로 감싸지 않아야 한다 */

printf("The code value of Escape characters can't use in string %c %c", \012 \x0a); /* 인용 부호로 감싸야 한다 */

앞에서 언급했듯이 탈출 문자열에 대한 코드 값을 모두 외워서 사용하기란 그리 만만치는 않을 것입니다. 더욱이 C 언어에서는 gets() 등의 문자열만을 출력하기 위한 다양한 형태의 함수들이 준비되어 있는데, 이러한 문자열 출력 함수에서는 탈출 문자에 해당하는 어떤 코드값을 사용할 수 없고 반드시 탈출 문자 또는 8진 또는 16진 형태의 문자형 상수를 사용해야 합니다.

프린터를 제어하는 탈출 문자인'\t, \v를 C 언어에서 제공하는 각종 화면 출력 함수(printf, putchar, putc, puts 등)들을 이용하여 화면상에 출력하면 정상적인 출력이 이루어지지 않고 이상한 문자가 출력됩니다.

즉, 프린터를 제어하는 탈출 문자는 프린터를 제어하는 용도로사용해야 합니다. 확인 문제 2는 터보 씨에서 프린터제어를 위한 탈출 문자의 사용 방법에 대하여 보여주고 있습니다. 여기에는 아직 배우지 않은 함수들과 파일 처리 부분이 나오는데, 우선 부담 없이 살펴보고 이에 관한 자세한 사항은 다음에 공부해보도록 합니다.



확인 문제 2
/* 프린터를 제어하는 탈출 문자열에 관한 프로그램 */
#include<stdio.h>
main()
{
FILE *str; /*화일의 포인터의 선언 */
int password;
str=stdprn; /*프린터를 화일 포인터에 할당 */
printf("\a\a\a\a4자리 양의 정수로 암호를입력:****\b\b\b\b");
scanf("%d", &password);
if(password == 1234)

{
fprintf(str,"This is a printer control prog mam:"); /*출력문 1 */
fprintf(str,"\b\b\b\b\b\b\b\b\b abcdefg\n\t\v"); /*출력문 2 */
fputc('\f',str); /*출력문 3 */
fprintf(str,"STOP"); /*출력문 4 */
}

else printf("password mismatching!! program terminated");
}


거의 모든 확인 문제는 터보 씨에서 실행시키는 것을 전제로 합니다. 그리고 확인 문제 2는 반드시 프린터를 켜놓은 상태에서 실행시켜야 합니다. 확인 문제 2에서 먼저 4번의 "삐"하는 발신음이 들리고 나서 양의 정수로 암호를 입력하기 위해서 다음과 같은 문자열이 화면에 출력됩니다.

4자리 양의 정수로 암호를 입력 : ****

이 때 커서는 4개의 '\b' 문자에 의해서 4칸 좌측으로 이동하기 때문에 첫번째 '*' 문자에서 입력을 기다리고, 정확한 암호(1234)를 입력하게 되면 '*' 문자는 지워지면서 입력한 정수가 나타나게 됩니다. 만약 입력된 password가 1234와 동일하다면 if 문의 블록을 실행하는데, 이 블록 내의 설명문(comment)에 표시된 출력문 1, 2, 3, 4를 자세히 살펴봅시다. 

출력문 1의 fprintf() 함수에서는 This is a printer control program: 이라는 문자열을 프린터에 출력합니다. 두번째 출력문에서는 9개의\b(Backspace)에 의해서 프린터 헤드는 좌측으로 9칸으로 이동하여 앞의 출력된 문자열의 control과 program: 사이의 공백에 위치합니다. 여기에서 abcdefg를 다시 출력하기 때문에 program:에 abcdefg가 중복 출력됩니다. 

그 모양을 여기에서 나타낼 수 없는 것이 아쉽군요. 하여간 이처럼 인쇄되고 나서 '\n'에 의해서 다음 줄로 헤드를 이동시키고 다시'\t'에 의해서 수평으로 지정된 거리만큼 헤드가 이동한 다음에, 다시 '\v'에 의해서 수직으로 지정된 거리만큼 헤드가 이동하게 됩니다.

세 번째 출력문에서 프린터 용지를 한 장 넘기게 되고, 마지막 네번째 출력문에 의해서 STOP이라는 문자열을 출력하고 프로그램을 종료합니다. 확인문제 2를 실행하기 위해서는 반드시 프린터를 켜 놓은 상태에서 실행시켜야 합니다. (앞에서 설명한 것처럼, 이 프로그램은 반드시 터보 씨를 이용하여 컴파일 해야 합니다.)


확인 문제 3
/* 탈출 문자 \', \", \\, \?, \ 에 대한 예제 프로그램 */
#include<stdio.h>
main()
{
printf("\'abc\' === 'abc'\n"); /*\'또는 '을 사용 */
printf("\"abc\"\n");/*\"은 "으로 사용해서는 안 됨 */
printf("\\abc\\ === \abc\\n"); /*\\은 \으로 사용해서는 안 됨 */
printf("What time is it now\? ??? \n");/*\?또는 ?을 사용 */

/* 두 줄로 나누어서 출력함 */
printf("하나의 문자열을 두 줄로 나누어서 출력 할 때는 \
\\을 사용한다.\n");

/* 첫번째 줄과 2번째 줄 사이에 13개의 공백이 존재함 */
printf("하나의 문자열을 두 줄로 나누어서 출력 할 때는 \
\\을사용한다.\n");
}



이름의 규칙



변수명, 함수명, 기호 상수 등에 붙이는 이름들은 다음과 같은 규칙을 따른다.






Reactions

댓글 쓰기

0 댓글