C언어(2020년)

30. 문자열

리더2333 2020. 11. 4. 14:41
반응형
#include <stdio.h>

int main()
{
    char str[4] = { 'a', 'b', 'c', 'd' };
    
    printf("%s\n", str);

    return 0;
}

이 코드를 실행시켜보면

abcd가 출력되고, 이상한 문자가 계속 해서 출력되는것을 알 수 있다.

 

이것은 문자열의 끝을 알리는 NULL 표식이 없기 때문이다.

 

C언어에서 NULL 이란 0 을 의미하며, 아스키코드로서의 NULL 은 '\0' 라고 표현한다.

char 형 변수에 숫자를 넣을 때에는 0,1,2,3... 이렇게 넣으면 되지만,

ASCII 코드의 문자를 넣을 때에는 'a' 이런식으로 소괄호로 묶어 줘야 한다.

ASCII 코드의 첫번째 값이 0 이며 이것은 NULL 을 의미하느데,

ASCII 코드의 48번째 숫자문자 '0' 과 구별하기 위하여 '\0' 이라고, 표현한다.

 

위의 코드에서는 str을 [5] 로 늘리고 5번째에 NULL, 이나 0 이나 '\0' 을 넣어줘서

문자열의 끝임을 알려줘야 한다.

 

#include <stdio.h>

int main()
{
    char str[5] = { 'a', 'b', 'c', 'd', '\0' };
    
    printf("%s\n", str);

    return 0;
}

 

 

문자열 변수처럼 사용하는

const char* 는 어떨까?

#include <stdio.h>

int main()
{
    char sss[5] = { 'a','b','c','d',0 };
    printf("sizeof(sss) : %d\n", sizeof(sss));

    const char* str = "abcd";
    printf("sizeof(\"abcd\") : %d\n", sizeof("abcd"));
    // sizeof(str) 하면 4가 나오는데, 그 이유는 포인터는 무조건 4 byte이기 때문이다.
    // 그래서 "abcd" 로 크기를 알아보았다.
    // printf 문 안에서 " 을 넣기위해서 \" 을 사용함

    int i = 0;
    while (str[i])
    {
        printf("%d : %c\n", i, str[i]);
        i++;
    }

    printf("5 : %d\n", str[5]);

    return 0;
}

// 결과
// sizeof(sss) : 5
// sizeof("abcd") : 5
// 0 : a
// 1 : b
// 2 : c
// 3 : d
// 5 : 0

sizeof(sss) 는 5인데,

sizeof("abcd") 도 5 이다.

 

while( ) 문에서 str[i] 가 0 이 아닐때 까지

실행시키자, a,b,c,d 모두 출력되고 블럭을 벗어났다.

그래서 확인차 str[5] 를 찍어 봤더니, 예상대로 0 이였다.

const char* 의 변수에는 NULL 을 마지막에 넣어주지 않아도,

자동적으로 뒤에 NULL 이 붙는다는걸 알 수 있다.

반응형

'C언어(2020년)' 카테고리의 다른 글

32. 함수 포인터  (0) 2020.11.04
31. sizeof  (0) 2020.11.04
29. typedef  (0) 2020.11.04
28. union  (0) 2020.11.04
27. 전처리기  (0) 2020.11.04