이름, 단어, 문장 등을 저장하기 위해서는 문자열을 사용합니다. 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를 활용해서 다양한 문자열 함수에 대한 사용법을 알아보세요.
다음시간에는 구조체에 대해 알아 보도록 하겠습니다.
'프로그래밍 > 자료구조' 카테고리의 다른 글
[C언어와 함께 자료구조를] 동적 기억장소 할당 (0) | 2015.03.12 |
---|---|
[C언어와 함께 자료구조를] 구조체 알아보기 (0) | 2015.03.11 |
[C언어와 함께 자료구조를] 포인터 활용 (0) | 2015.03.10 |
[C언어와 함께 자료구조를] 변수와 포인터 (0) | 2015.03.09 |
[C언어와 함께 자료구조를] 입문 – 자료구조가 뭐지? (0) | 2015.03.09 |
댓글