반응형
#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 |