본문 바로가기
카테고리 없음

C언어의 고유 특징에 대하여(31)

by 데일리J형 2022. 6. 15.

기본적 데이터 형이 아닌 '문자열'을 C 언어에서는 어떻게 표현하고 처리하는지에 대해 서술합니다.

스트링

 

스트링의 개념

 

앞에서는 C 언어에서 제공하는 기본적인 데이터 형(data type)인 int, long, float, double, char 등을 다루었습니다. 'int'와 'long'는 정수 데이터를 위한 것이며, 'float'와 'double'는 실수 데이터를 위한 것입니다. 또 'char'은 문자 데이터를 위한 것입니다. 그러나, C 언어 프로그램을 이용하여 처리할 데이터가 이러한 숫자 데이터 또는 문자 데이터만 있는 것은 아닙니다. 많은 응용 분야에서 '문자열'로 표현된 데이터를 입력, 처리, 저장하고 있습니다. 하지만, C 언어에서는 '문자열(string)'을 위한 기본적인 데이터 형은 존재하지 않습니다. 이 절에서는 기본적 데이터 형이 아닌 '문자열'을 C 언어에서는 어떻게 표현하고 처리하는지에 대해 서술합니다.

 

'문자열'은 보통 'string'이라고 표현하기도 합니다. 이때, 'string'이라는 것의 사전적 의미는 '줄, 끈, 실'이라는 뜻이지만, 컴퓨터 분야에서는 '일련의 문자들이 모여서 하나의 데이터로 취급되는 것'이라는 의미로 사용을 합니다. 즉, '문자열'은 일련의 '문자'들을 모아서 표현하는 데이터 형입니다. 따라서, '문자열'을 위한 기본적 데이터 형이 없는 C언어에서는 문자형(char)의 배열을 이용하여 '문자열'을 입력, 처리, 저장하고 있습니다. 따라서, C 언어에서 문자열의 정의는 다음과 같이 합니다.

 

char variable_name [size];

 

variable_name은 문자열을 위한 변수 명이며, size는 배열의 크기 즉, 저장할 문자열의 길이를 나타냅니다. 하지만, 문자열의 가장 마지막 문자는 '문자열의 끝'임을 나타내기 위해 널 문자(null character)인 '\0'이어야 하므로 실제로 저장할 수 있는 문자열의 길이는 최대 (size-1)입니다. 다음의 예제 프로그램을 보겠습니다.

 

#include <stdio.h>
int main(void)
{
     char name[20] = "홍길동";
     char addr[30];
     
     scanf("%s", addr);
     printf("안녕. %s 야!", name);
     printf("너의 주소는 %s이구나. \n", addr);
     return 0;
}

 

위의 예제 프로그램에서 ①은 '문자열 배열'을 이용하여 두 개의 문자열을 선언하였으며, 문자열 변수 - 즉, 배열의 이름 - 의 변수명은 각각 'name'과 'addr'이며, 영문자를 최대 19글자, 29글자를 넣을 수 있습니다. 그리고 문자열 변수 'name'에 "홍길동"이라는 문자열을 저장합니다. 이때, 문자열은 문자열 양끝에 인용 부호 (")를 두어 표현합니다. ②은 표준 입력 - 보통 키보드를 통한 입력 - 을 통해 입력된 문자열을 문자열 변수 'addr'에 넣습니다. ③은 표준 출력 - 보통 화면을 통한 출력 - 을 통해 printf 문의 형식(format)에 따라 출력을 하는데, 문자열 출력을 위해 '% s'를 사용합니다. 

 

스트링의 저장 구조

 

앞 절에서 C 언어에서는 문자열이 '문자의 배열'로써 표현이 된다고 하였습니다. 만약 프로그램에서 다음과 같이 선언을 하였다고 가정하겠습니다. 

 

char addr [20] = "chungbuk chungju";

 

이때, addr이라는 '문자의 배열'에 문자열 "chungbuk chungju"이 저장되는 구조는 다음과 같이 문자 배열 addr의 각 요소(element)에 한 문자씩 저장되어 있으며, 문자열의 끝을 나타내기 위해 '\0'가 문자열 가장 끝이 저장되어 있습니다. 아래의 그림에서는 addr [15]에 '\0'가 저장되어 있어 더 이상 문자들이 없음을 나타내고 있습니다. 

 

addr

[0] [1] [2] [3] [4] [5] [6] [7] [8] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19]
'c' 'h' 'u' 'n' 'g' 'b' 'u' 'k' '  ' 'c' 'h' 'u' 'n' 'g' 'j' 'u' '\0' - - - -

 

다음은 스트링이 저장되는 구조를 이용한 예제 프로그램입니다. 

 

예제

#include <stdio.h>
int main(void)
{
    int i;
    char addr[20] = "chungbuk chungju"'
    
    printf("원래 문자열 : %s \n", addr);
    addr[8] = '\0;
    printf("원래 문자열 : %s \n", addr);'
    for(i=0; i<=15; i++)
        printf("addr[%] = %c(%d) \n", i, addr[i]
        return 0;
}

 

예제 프로그램에서 ①은 스트링 addr을 화면에 출력을 하며, ②에서 문자열 배열 addr의 아홉 번째 요소 - 인덱스는 8-에 널 문자인 '\0'을 넣은 후, 다시 ③에서 스트링 addr을 화면에 출력을 합니다. 이때, addr [8]에 '\0'이 저장되어 있으므로 함수 printf는 addr [0]~addr [7]까지만 스트링으로 취급하여 화면에 "chungbuk"만을 출력합니다. ④는 스트링 addr에 실제로 저장되어 있는 내용을 문자와 함께 그 ASCII코드를 출력합니다. 

댓글