c언어에서는 char를 이용하여 문자나 문자열을 저장할 수 있고 char의 크기 및 범위는
char signed char |
1바이트, 8비트 | -128~127 | 문자 저장 |
unsigned char | 1바이트, 8비트 | 0~255 | 바이트 단위 데이터 저장 |
그리고 char는 문자 자체를 저장하는 것이 아닌 그 문자의 해당하는 정수 값을 저장한다. 그러면 그 문자의 정수 값을 어떻게 알 수 있을까? 그것은 아스키(ASCII) 코드를 이용하여 알 수 있다.
32 | 0x20 | 공백(space) | 64 | 0x40 | @ | 96 | 0x60 | ` |
33 | 0x21 | ! | 65 | 0x41 | A | 97 | 0x61 | a |
34 | 0x22 | " | 66 | 0x42 | B | 98 | 0x62 | b |
35 | 0x23 | # | 67 | 0x43 | C | 99 | 0x63 | c |
36 | 0x24 | $ | 68 | 0x44 | D | 100 | 0x64 | d |
37 | 0x25 | % | 69 | 0x45 | E | 101 | 0x65 | e |
38 | 0x26 | & | 70 | 0x46 | F | 102 | 0x66 | f |
39 | 0x27 | ' | 71 | 0x47 | G | 103 | 0x67 | g |
40 | 0x28 | ( | 72 | 0x48 | H | 104 | 0x68 | h |
41 | 0x29 | ) | 73 | 0x49 | I | 105 | 0x69 | i |
42 | 0x2A | * | 74 | 0x4A | J | 106 | 0x6A | j |
43 | 0x2B | + | 75 | 0x4B | K | 107 | 0x6B | k |
44 | 0x2C | , | 76 | 0x4C | L | 108 | 0x6C | l |
45 | 0x2D | - | 77 | 0x4D | M | 109 | 0x6D | m |
46 | 0x2E | . | 78 | 0x4E | N | 110 | 0x6E | n |
47 | 0x2F | / | 79 | 0x4F | O | 111 | 0x6F | o |
48 | 0x30 | 0 | 80 | 0x50 | P | 112 | 0x70 | p |
49 | 0x31 | 1 | 81 | 0x51 | Q | 113 | 0x71 | q |
50 | 0x32 | 2 | 82 | 0x52 | R | 114 | 0x72 | r |
51 | 0x33 | 3 | 83 | 0x53 | S | 115 | 0x73 | s |
52 | 0x34 | 4 | 84 | 0x54 | T | 116 | 0x74 | t |
53 | 0x35 | 5 | 85 | 0x55 | U | 117 | 0x75 | u |
54 | 0x36 | 6 | 86 | 0x56 | V | 118 | 0x76 | v |
55 | 0x37 | 7 | 87 | 0x57 | W | 119 | 0x77 | w |
56 | 0x38 | 8 | 88 | 0x58 | X | 120 | 0x78 | x |
57 | 0x39 | 9 | 89 | 0x59 | Y | 121 | 0x79 | y |
58 | 0x3A | : | 90 | 0x5A | Z | 122 | 0x7A | z |
59 | 0x3B | ; | 91 | 0x5B | [ | 123 | 0x7B | { |
60 | 0x3C | < | 92 | 0x5C | \ | 124 | 0x7C | | |
61 | 0x3D | = | 93 | 0x5D | ] | 125 | 0x7D | } |
62 | 0x3E | > | 94 | 0x5E | ^ | 126 | 0x7E | ~ |
63 | 0x3F | ? | 95 | 0x5F | _ |
이 표에서 중요한건 65~90까지는 A~Z 97~122까지는 a~z이라는 것만 숙지하면 된다. 다른 표는 필요할 때마다 찾아서 쓰면 된다.
위에 코드를 보면 작은 따옴표 (' ')를 이용하여 char에 문자를 할당하는데 char에는 작은따옴표를 쓸 시 하나의 문자만 저장 가능하며 큰 따옴표 (" ") 이용하면 두개이상의 문자 즉 문자열을 저장할 수 있다.
더 나아가 c언어에서는 문자를 정숫값으로 저장을 하며 한 문자당 1바이트 값을 지니고 있는데 이를 이용하여 정수형 자료형에 바이트 값을 저장할 수 있는데 unsigned short name2 에 'ab'를 할당하고 크기를 출력하면 2를 출력하게 된다. (unsigned를 붙여준 이유는 문자는 부호가 없으므로 이를 명확하게 하기 위해 붙였다.)
그래서 이렇게 바이트 크기를 나타낼때는 작은따옴표 안에 두 개 이상의 문자를 넣을 수 있다. (short의 바이트 최대 크기는 2이다.)
char name3 은 'ab'를 할당 했는데 b만 나온 이유는 일단 char형은 1바이트로 작은따옴표로는 하나의 문자만 묶을 수 있기에 앞에 a는 잘리고 뒤에 b만 출력이 된다.
[문자 변수 선언방법]
c1은 문자 0을 할당한 것이며 c2는 숫자 0을 할당했다. 이에 대한 출력 값은 어떻게 될 것인가?
먼저 c1은 서식지정자 %c로 출력을 하면 문자 0을 출력하고 서식지정자%d를 할 경우 아스키코드에 있는 문자 0에 해당하는 48이라는 정숫값을 출력한다.
c2는 %c를 사용할 경우 이스키 코드에서 0은 Null를 의미하기에 아무것도 출력하지 않으며 %d로 출력하면 숫자 그대로인 0을 출력한다.
16진수로 표현하는 방법도 알아보자.
먼저 c1에 0x61라는 16진수 표현법으로 할당을 하였다. 먼저 0x61은 아스키코드로는 a에 해당하며 고로 출력 값은
순서대로 a 97 0x61 이 출력이 되었다. 16진수로 출력하기 위한 서식지정자는 0x%x이지만 사실 %x로도 출력이 가능하다 하지만 다른 숫자를 할당할 경우 10진수와 헷갈리고 모호한 경우가 있어 0x%x의 서식지정자를 사용하는 것이다.
더 나아가 문자로 연산이 가능하다
위와 같이 c1은 97 아스키코드 표에선 a를 뜻하고 c2는 'b' 정숫값은 98이다. 이를 출력할 때 1씩 더해주면 출력 값은
정숫값은 +1 이 되었으며 문자는 다음 순번의 아스키코드표의 문자가 출력이 된다.
[제어 문자 사용하기]
10진수 | 16진수 | 문자 | 표기법 | 설명 |
10 | 0x0A | LF | \n | 개행, 라인 피드(Line Feed), 새 줄(new line), 줄바꿈 |
13 | 0x0D | CR | \r | 복귀, 캐리지 리턴(Carriage Return), 줄의 끝에서 시작 위치로 되돌아감 |
9 | 0x09 | TAB | \t | 수평 탭(horizontal tab) |
위의 표를 이용하여 사용자가 상황에 맞게 쓰면 된다.
쓰는 방법은 두 가지가 있는데
위와 같이 \n를 직접 할당하여 쓰는 방식과
printf 안에서 \n를 직접 쓰는 두가지 방식이 있다. 보통은 2번째 방식을 쓰며 1번째 방식은 제어 문자의 정숫값과 아스키코드값을 알아내기 위해 쓰인다.
'c언어' 카테고리의 다른 글
c언어. 실수 자료형 사용하기 (0) | 2021.07.15 |
---|---|
C언어. 정수 자료형 사용하기 (0) | 2021.07.13 |
C언어. 변수 만들기 (0) | 2021.07.07 |