C 언어 | 배열 | 문자열
변수로 문자열을 저장하는 방법을 설명한다. 문자열은 문자의 배열이며 char 형의 배열로 관리할 수 있다.
문자열을 변수에 저장하기
지금까지 변수에 저장된 정보는 문자, 정수, 부동 소수점 중 하나였다. 그러나 문자열을 저장하는 방법은 아직 설명하지 않았다. 사실 C 언어에는 문자열을 나타내는 전용 형태라는 것이 없다.
그럼 문자열을 변수로 다루고 싶은 경우는 어떻게 해야 할까? 문자열은 연속된 문자 상수라고 생각할 수 있다. 즉, 복수 개의 연속된 ASCII 코드 값이다. “연속적인 값"이라는 것을 제어하기 위한 가장 좋은 방법은 이미 설명하였다. “배열"에서 설명한 배열 이야말로 문자열을 표현하는 수단이다.
문자열 char 형의 배열로 저장할 수 있다. 그리고 표시할 때 한 글자씩 순서대로 표시하는 방법을 생각할 수 있을 것이다.
코드1
#include <stdio.h>
int main() {
char chStr[6];
int iCount;
chStr[0] = 'K';
chStr[1] = 'i';
chStr[2] = 't';
chStr[3] = 't';
chStr[4] = 'y';
chStr[5] = '\n';
for(iCount = 0 ; iCount < 6 ; iCount++)
printf("%c" , chStr[iCount]);
return 0;
}
코드1에서 char 형의 배열 chStr의 각 요소에 1문자씩 문자 상수를 대입하고 있다. 마지막으로 printf() 함수를 사용하여 대입한 문자를 역시 한 글자 씩 표시하고 있다. 물론 문자열은 표시되지만, 효율적인 방법이라고는 할 수 없다.
먼저 문자를 표시하려면 문자의 수만큼 반복 처리할 필요가 있지만, 반드시 문자 수를 관리할 수 있는 것은 아니다. 그래서 문자열의 마지막은 항상 0으로 표시하도록 한다. 이러한 규칙을 있으면 문자수를 관리할 필요가 없어진다.
코드2
#include <stdio.h>
int main() {
char chStr[7];
int iCount;
chStr[0] = 'K';
chStr[1] = 'i';
chStr[2] = 't';
chStr[3] = 't';
chStr[4] = 'y';
chStr[5] = '\n';
chStr[6] = 0;
for(iCount = 0 ; chStr[iCount] ; iCount++)
printf("%c" , chStr[iCount]);
return 0;
}
코드2는 코드1을 개량하여 배열 변수의 끝은 0이라고 정하고, 그 규칙에 적응한 for 루프를 작성하고 있다.
printf() 함수 같은 C 언어의 표준 함수는 바로 이와 같이 문자열의 끝은 0으로 끝나는 규칙을 정하고 있다. 따라서 “Kitty"라는 문자열 리터럴은 문자 배열로 생각하면 그 끝은 y 대신 0으로 끝나는 6 개의 요소로 구성된 배열로 간주한다. 문자열의 끝을 나타내는 이 0을 NULL 문자라고 한다.
printf() 함수의 서식 제어 문자에 %s를 지정하면 문자 배열을 표시하는 것을 나타낸다. printf() 함수는 전달된 문자 배열을 조사해 NULL 문자가 나타날 때까지 배열을 순서대로 표시한다. 즉, 코드2와 같은 것을 해준다. 그리고 printf() 함수의 첫번째 인수로 지정하여 서식 제어 문자열도 또한 NULL로 끝나는 문자열로 취급되고 있는 것이다.
코드3
#include <stdio.h>
int main() {
char chStr[7];
int iCount;
chStr[0] = 'K';
chStr[1] = 'i';
chStr[2] = 't';
chStr[3] = 't';
chStr[4] = 'y';
chStr[5] = '\n';
chStr[6] = 0;
printf("%s : %s" , "Kitty" , chStr);
return 0;
}
이 프로그램 printf() 함수에 주목한다. printf() 함수는 “Kitty"라는 문자열 리터럴과 chStr 배열 변수를 인수로 전달한다. 문자열 리터럴은 암묵적으로 그 끝이 NULL 문자이다. 그리고 chStr 명시적으로 chStr[6]에 0을 대입하고 있다. 이들은 NULL 문자로 끝나는 문자 배열로 printf() 함수에 의해 화면에 표시된다.
그런데 printf() 함수에 chStr 배열 변수를 전달할 때에 인덱스를 사용하지 않고 변수 이름만을 지정하고 있다. 배열은 첨자를 지정하지 않고 변수명만을 지정했을 경우, 그 배열의 시작을 나타낸다. 다만, 보다 정확하게는 배열의 첫번째 메모리 주소를 나타내는 것이라도 할 수 있다. 이것에 대해서는 포인터를 설명할 때 자세히 설명한다. 배열과 포인터는 밀접한 관계를 가지고 있기 때문에 배열을 충분히 이해하기 위해서는 포인터의 이해가 필요하다.