69. 문자열 사용 기초

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);
}