35.3 배열 형태로 문자열 선언하기

문자열은 문자(char) 배열에 저장할 수도 있습니다.

  • char 배열이름[크기] = "문자열";

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

string_array.c

#include <stdio.h>

int main()
{
    char s1[10] = "Hello";  // 크기가 10인 char형 배열을 선언하고 문자열 할당

    printf("%s\n", s1);     // Hello: %s로 문자열 출력

    return 0;
}

실행 결과

Hello

char s1[10] = "Hello";와 같이 크기가 10인 char형 배열(문자 배열)을 선언한 뒤 문자열을 할당했습니다. 그리고 printf에서 서식 지정자 %s로 배열을 출력해보면 배열에 저장된 문자열이 출력됩니다.

문자열 리터럴을 포인터에 할당하는 방식과는 달리 문자열을 배열에 저장하는 방식은 배열 요소 하나 하나에 문자가 저장됩니다. 즉, 이렇게 배열 안에 일렬로 나열된 문자가 모여 문자열을 이루게 되죠. 물론 배열이기 때문에 인덱스는 0부터 시작합니다. 그리고 여기서도 문자열의 맨 뒤에 NULL이 들어갑니다.

그림 35‑3 문자열을 배열에 저장하기

배열에 문자열과 NULL을 저장한 뒤 남는 요소들은 딱히 신경 쓸 필요는 없습니다. 보통 남는 공간에는 모두 NULL이 들어갑니다.

배열로 문자열을 사용할 때 한 가지 주의할 점은 배열을 선언한 즉시 문자열로 초기화해야 한다는 점입니다. 배열을 미리 선언해놓고 문자열을 나중에 할당할 수는 없습니다.

string_array_assign_error.c

#include <stdio.h>

int main()
{
    char s1[10];     // 크기가 10인 char형 배열 선언
    
    s1 = "Hello";    // 이미 선언된 배열에 문자열을 할당하면 컴파일 에러 발생

    printf("%s\n", s1);    // Hello: %s로 문자열 출력

    return 0;
}

컴파일 결과

string_array_assign_error.c(7): error C2106: '=' : 왼쪽 피연산자는 l-value이어야 합니다.

이미 선언된 배열에는 문자열을 할당할 수 없습니다. 정 할당하고 싶다면 다음과 같이 배열의 요소에 문자를 하나 하나 집어넣으면 됩니다.

s1[0] = 'H';
s1[1] = 'e';
s1[2] = 'l';
...

문자열이 짧다면 금방 넣을 수 있겠지만 문자열이 길어진다면 이 방식은 매우 불편하죠. 이미 선언된 배열에 문자열을 넣는 방법은 'Unit 38 문자열을 복사하고 붙이기'에서 자세히 설명하겠습니다.

배열을 선언할 때는 배열의 크기를 할당할 문자열보다 크게 지정해야 합니다.

char s1[10] = "Hello";    // 크기가 10인 배열. Hello는 5글자이므로 올바른 방법
char s2[3] = "Hello";     // 크기가 3인 배열. Hello는 5글자이므로 잘못된 방법

문자열의 문자 개수보다 배열의 크기가 작다면 컴파일은 되지만 문자열을 출력했을 때 제대로 출력되지 않습니다.

그렇다면 문자열을 저장할 때 배열의 최소 크기는 얼마일까요? Hello라면 5글자니까 배열의 크기는 5라고 생각하기 쉽습니다.

char s1[6] = "Hello";    // 크기가 6인 배열. Hello 5글자에 NULL 하나를 더해 6개의 공간이 필요함

문자열을 저장할 배열을 선언한다면 크기는 Hello 5글자에 NULL 하나를 더해 6이 되야 합니다.

그림 35‑4 문자열을 배열에 저장할 때 배열의 최소 크기

다음과 같이 문자 배열을 선언하면서 문자열을 바로 할당할 때는 배열의 크기를 생략할 수 있습니다.

  • char 배열이름[] = "문자열";

string_array_omit_size.c

#include <stdio.h>

int main()
{
    char s1[] = "Hello";    // 문자열을 할당할 때 배열의 크기를 생략하는 방법

    printf("%s\n", s1);     // Hello: %s로 문자열 출력

    return 0;
}

실행 결과

Hello

배열의 크기는 할당되는 문자열의 문자 개수에 맞춰 자동으로 지정됩니다. 여기서는 Hello이므로 5에 NULL 하나를 더해 6이 됩니다.