본문 바로가기
프로그래밍/자료구조

[C언어와 함께 자료구조를] 문자열과 배열

by 헬맷쓰다 2015. 3. 10.
반응형

   이름, 단어, 문장 등을 저장하기 위해서는 문자열을 사용합니다. C언어에서 문자열은 문자의 배열입니다. 최대 10개의 문자를 가지는 문자열 str은 다음과 같이 선언합니다.

char str[10];

   C언어의 배열은 인덱스가 0부터 시작하므로 문자열 str의 첫번째 문자는 s[0], 마지막 문자는 s[9]가 됩니다. 예를 들어 문자열 str에 "Hi"를 저장하려면, 배열 str의 처음 두개의 위치에 문자를 저장하고, 이 두개의 문자만이 유효하다는 표시를 해야 합니다. C언어에서 문자열의 마지막 문자 다음에 Null 문자로 문자의 마지막을 표시합니다. 아래의 예에서 Null문자는 '\0'을 사용했는데요, 이는 문자 '0'이 아닌 Null (아무것도 안들어 있다. 즉 코드값은 0x00) 문자를 의미합니다.

str[0] = 'H';  
str[1] = 'i';   
str[2] = '\0';

 

문자열 함수

   C라이브러리에는 문자열 함수가 여러가지가 있습니다. 코딩을 하는데 이들 함수들의 사용법을 익히는 것이 필요하지만 어떻게 구현되어 있는지에 대한 관점에서 몇가지 함수들을 살펴보도록 하겠습니다. 이는 라이브러리와 다르므로 "my_"로 시작하는 함수 이름을 사용합니다.

1) 문자열 길이를 계산하는 함수

     라이브러리함수    : size_t strlen(const char *s);       

     구현함수          : int my_strlen (const char *s);

int my_strlen (const char *s) 

{
     int i;

     i = 0;

     while (s[i] != '\0') //문자열의 첫번째 요소부터 NULL문자를 만날 때까지 요소검사를 한다.
         i++;

     return i;
}

 

2) 두개의 문자열을 비교하는 함수

       라이브러리함수 : size_t strcmp(const char *s1, const char *s2);

       구현 함수       : int my_strcmp(const char *s1, const char *s2);

       리턴 값         : 문자열이 같으면 - 0, 사전식 순서로 s1이 s2보다 앞에 오면 - 음수, 뒤에 오면 - 양수

int my_strcmp (const char *s1, const char *s2) 

{
     int i;

     for (i = 0; s1[i] != '\0' && s1[i] == s2[i]; i++)
         /* s1[i]가 null이 아니고 s1[i]와 s2[i]가 같은 경우 계속 비교 */
         ;

     return s1[i] - s2[i];  /* i번째 문자열이 같으면 0 즉 s1과 s2의 문자열이 같은 경우이고, 다른경우는 0이 아닌값을 반환 */
}

 

3) 문자열을 복사하는 함수

       라이브러리함수 : char *strcpy(char *dest, const char *src);

       구현 함수         : char *my_strcpy(char *dest, const char *src);

       리턴 값            : 복사된 dest문자열의 포인터

char *my_strcpy (char *dest, const char *src) 

{
     int i;

     for (i = 0; src[i] != '\0'; i++)  /* 원본 문자열의 끝을 만날때까지 */
         dest[i] = src[i];              /* 원본에서 대상으로 배열의 요소를 입력합니다. */

     dest[i] = '\0';                    /* 대상 문자열의 마지막에 null문자를 넣어 문자열의 끝을 표시합니다. */

     return dest;
}

   위 세개 함수의 인수들은 포인터를 사용했는데, 각각의 함수의 인수를 크기가 지정되지 않은 배열로 사용해도 됩니다.

int my_strlen (char s[]); 
int my_strcmp (char s1[], const char s2[]); 
char *my_strcpy (char dest[], const char src[]);  

   배열 s[]의 이름 s는 &s[0]와 같은 의미로 s[0]를 가리키는 포인터이므로 배열과 포인터는 서로 밀접한 관계가 있다는 것을 알 수 있습니다.

지금까지 문자열함수 몇 가지를 알아봤는데요. string man page를 활용해서 다양한 문자열 함수에 대한 사용법을 알아보세요.

다음시간에는 구조체에 대해 알아 보도록 하겠습니다.

반응형

댓글