char str [14] = "Good Morning!";
char str[ ] = "Good Morning!";
위 문장들에서 볼 수 있듯이 이문장의 배열의 길이는 14이다.
그런데 공백문자와 !문자를 포함하여 13 문자인데 왜 길이가 14일까?
그것은 문자열 끝의 널문자('\0') 때문이다.
즉 문자열의 저장을 목적으로, char형 배열을 선언할 경우 널문자가 저장될 공간까지 생각해서 배열의 길이를 결정해야 한다.
5행에서 4행에서 선언된 배열의 크기를 출력하고 있는데, 출력 값은 14이다. 이는 널문자를 고려해서 배열의 길이가 결정된 결과이다. char형의 크기가 1바이트 이기 때문에 14라는 수가 나올 수 있었다.
그리고 위에서 볼 수있듯이 널문자의 아스키 코드값은 0이고
이를 문자의 형태로 출력 할 경우, 아무런 출력이 발생하지 않는다
위 9행에서 볼 수 있듯이, 서식 문자 % s는 문자열의 입력(scanf일 경우)을 뜻한다. 그리고 str은 문자열이 저장될 배열을 명시한 것이다. 위 문장에서 볼 수 있듯이
str앞에 & 연산자가 없는데 문자열을 입력 받는 배열의 이름 앞에는 & 연산자를 붙이지 않는다.
위 13행에서 볼 수있듯이 scanf함수 호출을 통해 입력받은 문자열의 끝에도 널 문자가 삽입되었음을 알 수 있고,
사실 배열에 저장되는 문자열 뿐만 아니라, c언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.
문자열에 있어 널문자의 존재는 매우 중요한데,
널문자가 존재하면 문자열이고, 널문자가 존재하지 않으면 문자열이 아니다.
char arr[] = {'H', 'i', '~'}; 의 배열 선언은 문자열이라 할 수 있을까? 그 답은 아니다 이다.
마지막에 널 문자가 없으므로 문자 배열이다. 이는 문자가 저장된 배열 일 뿐이다.
char arr1[] = {'H', 'i', '~', '\0' };은 문자열이라 할 수 있을까? 답은 그렇다 이다.
마지막에 널 문자가 있으므로 이는 문자열이 저장된 배열이라 할 수 있다.
이 예제는 문자열의 중간에 널 문자를 삽입해 문자열의 끝을 변경하고 있는데,
이렇게 문자열의 끝이 변경되었을때 변경된 끝을 기준으로 문자열이 출력되는 것을 볼 수 있다.
널문자의 아스키 코드값은?
널문자의 아스키 코드값은 0이므로 밑의 두문장은 동일하다.
str [8] = '\0';
str [8] = 0;