9.1 문자 변수 선언하기

이제 문자 변수에 문자를 저장하고 출력해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

char.c

#include <stdio.h>
 
int main()
{
    char c1 = 'a';    // 문자 변수를 선언하고 문자 a를 저장
    char c2 = 'b';    // 문자 변수를 선언하고 문자 b를 저장
 
    // char를 %c로 출력하면 문자가 출력되고, %d로 출력하면 정숫값이 출력됨
    printf("%c, %d\n", c1, c1);    // a, 97: a의 ASCII 코드값은 97
    printf("%c, %d\n", c2, c2);    // b, 98: b의 ASCII 코드값은 98
 
    return 0;
}

실행 결과

a, 97
b, 98

char 변수에 'a', 'b'와 같이 작은따옴표로 문자를 묶어서 저장했습니다. printf 함수로 char 변수나 문자를 출력할 때는 서식 지정자로 %c를 사용합니다. 만약 서식 지정자로 %d를 사용하여 출력하면 char 변수에 저장된 정숫값(ASCII 코드값)이 그대로 출력됩니다.

여기서 'a''b'를 출력했으므로 ab 문자가 그대로 출력되고, 표 8‑2의 내용대로 a의 정숫값인 10진수 97, b의 정숫값인 10진수 98이 출력됩니다. 다른 알파벳 문자들도 넣어서 출력해보세요.

참고 

  • %c: 문자(character)의 약어로 c를 사용합니다.

참고 | 문자열

문자 여러 개로 이루어진 문자열은 다소 어려운 주제이므로 'Unit 35 문자열 사용하기'에서 자세히 설명하겠습니다.

작은따옴표로 문자를 넣지 않고 정수만으로 문자 자료형을 사용할 수도 있습니다.

char_ascii.c

#include <stdio.h>

int main()
{
    char c1 = 97;    // a의 ASCII 코드값 97 저장
    char c2 = 98;    // b의 ASCII 코드값 98 저장

    // char를 %c로 출력하면 문자가 출력되고, %d로 출력하면 정숫값이 출력됨
    printf("%c, %d\n", c1, c1); // a, 97
    printf("%c, %d\n", c2, c2); // b, 98

    return 0;
}

실행 결과

a, 97
b, 98

변수 c1, c2에 정수 그대로 ASCII 코드값 97, 98을 넣었는데 printf 함수에서 %c로 출력해보면 알파벳 소문자 a, b가 나옵니다. 즉, 표 8‑2의 내용대로 정수 97과 문자 'a'는 같으며 어떤 서식 지정자를 사용해서 출력하느냐에 따라 다르게 보입니다.

여기서 ASCII 코드값 97, 98은 10진수입니다. 이번에는 ASCII 코드값 16진수를 넣어서 문자 자료형을 사용해보겠습니다.

char_ascii_hex.c

#include <stdio.h>

int main()
{
    char c1 = 0x61;    // a의 ASCII 코드값 0x61 할당
    char c2 = 0x62;    // b의 ASCII 코드값 0x62 할당

    // char를 %c로 출력하면 문자가 출력되고, %d로 출력하면 정수 값이 출력됨
    // %x로 출력하면 16진수로 출력됨
    printf("%c, %d, 0x%x\n", c1, c1, c1);    // a, 97, 0x61
    printf("%c, %d, 0x%x\n", c2, c2, c2);    // b, 98, 0x62

    return 0;
}

실행 결과

a, 97, 0x61
b, 98, 0x62

마찬가지로 printf 함수에서 %c로 출력해보면 알파벳 소문자 a, b가 출력됩니다. 그리고 ASCII 코드대로 10진수 97, 98 그리고 16진수 0x61, 0x62가 나옵니다.

printf 함수에서 16진수를 출력하려면 서식 지정자로 %x를 사용합니다(%X는 16진수의 알파벳을 대문자로 표시). 여기서 %x로는 16진수의 숫자만 출력될 때 10진수와 구분하기가 힘듭니다. 그래서 보통 서식 지정자 앞에 0x를 붙여서 0x%x와 같이 만든 뒤 0x61, 0x62 형태로 출력합니다.

참고 

  • %x, %X: 16진수(hexadecimal)에서 hex의 x를 사용합니다.

문자 자료형에 같은 숫자를 저장한다 하더라도 문자 '0'과 숫자 0은 전혀 다르므로 주의합니다.

char_zero.c

#include <stdio.h>

int main()
{
    char c1 = '0';    // 문자 0을 저장
    char c2 = 0;      // 숫자 0을 저장

    printf("%c %d\n", c1, c1);    // 0 48: 문자 상태로 0이 출력됨
                                  // 문자 0의 ASCII 코드 48이 출력됨

    printf("%c %d\n", c2, c2);    // 0: ASCII 코드 0은 널문자이므로 아무것도 출력되지 않음
                                  // 정수 0이 출력됨

    return 0;
}

실행 결과

0 48
  0

char 변수에 작은따옴표로 감싼 숫자 '0'을 저장하면 숫자라 하더라도 문자 상태로 출력됩니다. 따라서 printf에서 %c로 출력하면 0이 출력됩니다. 그리고 %d로 출력해보면 문자 '0'의 ASCII 코드값인 48이 나옵니다.

여기서 char 변수에 숫자 0을 그대로 넣었을 때는 %c로 출력해도 아무것도 출력되지 않습니다. 왜냐하면 ASCII 코드 0은 널 문자(NULL)를 뜻하며 아무 것도 들어있지 않은 상태이기 때문입니다.

즉, printf에서 %d로 출력했을 때 '0'은 48, 0은 0으로 출력되므로 전혀 다른 값이라는 것을 알 수 있습니다.