C언어에서 문자열은 아스키 코드의 나열이예요.
특히 아스키 코드 값이 0인 문자를 널문자(‘\0’)라고 부르는데 문자열은 널문자를 만나기 전까지의 아스키 코드 나열이예요.
따라서 문자열을 char 형식 원소 배열을 선언할 때 널문자를 포함하여 원소 개수를 정하세요.
이 책에서는 문자열을 배열로 관리할 때 원소 개수를 나타내는 부분을 MAX_NAME_LEN+1 처럼 표현하고 있어요.
#define MAX_NAME_LEN 50 char name[MAX_NAME_LEN+1] = {'a','b','c'};
그리고 C언어에서는 문자열 리터럴 상수를 초기화 구문에서도 사용할 수 있어요.
#define MAX_ADDR_LEN 100 char addr[MAX_ADDR_LEN+1] = "제주도 제주시 애월읍 고내리";
◈ char 형식 배열에 문자열 초기화
#include <stdio.h> #define MAX_NAME_LEN 50 #define MAX_ADDR_LEN 100 int main() { char name[MAX_NAME_LEN+1] = {'a','b','c'}; char addr[MAX_ADDR_LEN+1] = "제주도 제주시 애월읍 고내리"; printf("이름:%s\n",name); printf("주소:%s\n",addr); return 0; }
◈ 실행 결과
이름:abc 주소:제주도 제주시 애월읍 고내리
문자열 리터럴 상수를 포인터 변수로 사용할 수도 있어요.
주의할 점은 포인터는 단순히 문자열이 있는 주소를 기억할 뿐이예요.
문자열을 변경하는 작업은 할 수 없어요.
따라서 문자열 데이터를 상수로 사용할 때는 const char *로 변수를 선언하세요.
const char *str = "안녕하세요.";
선언문에 const 키워드를 나타내어 상수화하는 것을 알고 있죠.
포인터 변수를 선언할 때 const 키워드는 여러 위치에 표현할 수 있으며 위치에 따라 의미가 달라져요.
만약 선언한 이름 앞에 const가 붙으면 포인터 상수를 선언한 것이 되며 값을 변경하지 못해요.
char * const str1 = name; //str1++; str1의 값을 변경할 수 없음 str1[0] = 'k';
포인터 선언문의 지시 연산자 * 앞에 const가 붙으면 가리키는 곳의 값을 변경하지 못한다는 의미예요.
const char *str2 = name; str2++; //str2[0]='k';str2로 간접 연산이나 인덱스 연산으로 가리키는 원소의 값을 변경할 수 없음
참고로 const char *str2;와 char const *str2; 는 같은 표현이예요.
실제 프로그래밍을 하다보면 *앞에 const가 붙는 const char *str2;나 char const *str2; 와 같은 표현은 자주 만나요.
특히 함수의 입력 매개 변수로 사용할 때가 많은데 호출하는 곳에서 전달받은 문자열을 변경하지 않고 사용만 하겠다는 의미죠.
void View(const char *str) { printf("%s\n",str); }