카테고리 없음

C언어에서 char[]에 한글을 넣고 출력하면 생기는 일

hyuckkim 2021. 2. 21. 23:25
#include <stdio.h>

int main()
{
    char chars[] = "가나다라마바사";
    char a;
    int i = 0;
    for(i = 0; i < sizeof(chars) / sizeof(char); i++)
    {
        a = chars[i];
        printf("%c", a);
    }

    return 0;
}

이렇게 생긴 코드가 있다.

출력값은 "가나다라마바사" 이다.

char에 1바이트만 저장되는 줄 알았는데 왜 값이 다 출력되지 싶어서 i 값을 같이 출력해 보기로 했다.

#include <stdio.h>

int main()
{
    char chars[] = "가나다라마바사";
    char a;
    int i = 0;
    for(i = 0; i < sizeof(chars) / sizeof(char); i++)
    {
        a = chars[i];
        printf("%c%d", a, i);
    }

    return 0;
}

(printf 함수에 %d로 i를 출력하는 내용이 추가되었다)

그러고 나니까 출력값이 신기하게 나왔다.

�0�1�2�3�4�5�6�7�8�9�10�11�12�13�14�15�16�17�18�19�2021

이거는 왜 안되지 생각하면서 별 생쇼를 다 해봤는데 그건 생략하도록 하자.

 

어쨌든 답은 그거였다.

분명 루프는 0에서 21까지 22번 다 돌고 있었다!

utf-8에서 한글은 3byte니까 '가' 한글자가 0 1 2번을 차지하고 있었던 것이다.

 

그렇게 마지막 코드를 실행했다.

#include <stdio.h>

int main()
{
    char chars[] = "가나다라마바사";
    char a;
    int i = 0;
    printf("%c", chars[0]);
    printf("%c", chars[1]);
    printf("%c", chars[5]);
    for(i = 0; i < sizeof(chars) / sizeof(char); i++)
    {
        a = chars[i];
        printf("%c", a);
    }

    return 0;
}

위쪽에서 따로 printf를 불러서 0 1 5 먼저 출력해보고 반복하는 코드다.

�가나다라마바사

이렇게 나오겠거니 하면서 실행해 보니까

갘가나다라마바사

출력값이 이렇게 나왔다.

'가' 가 EA B0 80

'나' 가 EB 82 98 인데 0, 1, 5라는 건 가에서 1번, 2번 바이트를 받고 나에서 3번 바이트를 받아서

EA B0 98 '갘'이 된다.

 

오늘의 결론.

Ascii 값이 아닌 글자는 printf에 char 하나씩 넣어서 합체시켜서 만들어진다.

AC00은 utf-16용이다.

그래서 한글 검사는 어떻게 하는건데..