C 문자열 할당 및 조작: 선언, 초기화 및 일반 함수 설명

1. 소개

C 프로그래밍 언어에서 문자열은 단순히 문자 배열로 취급됩니다. 이러한 특성 때문에 다른 언어의 문자열과는 다르게 다루어야 합니다. 특히 문자열을 할당하거나 초기화할 때는 문자열을 올바르게 종료시키기 위해 널()를 포함시켜야 합니다. 이 글에서는 “C 문자열 할당”이라는 주제로 기본 선언부터 할당·조작 방법, 그리고 프로그램 안정성을 유지하기 위한 중요한 주의사항까지 모두 다룹니다.

2. 문자열 선언 및 초기화

C에서는 문자열을 문자 배열을 통해 선언합니다. 아래는 흔히 사용되는 선언·초기화 방법 몇 가지입니다.

배열을 이용한 선언 및 초기화

문자열은 배열을 이용해 다음과 같이 선언하고 초기화할 수 있습니다:

char greeting[] = "Hello";

위 예시에서 문자열 greeting은 “Hello”로 초기화되며, 끝에 널 문자()가 자동으로 추가됩니다. C에서는 선언 시 = 연산자를 사용해 배열을 초기화할 수 있으며, 이 방법에서는 크기 지정을 생략하는 것이 일반적입니다.

널 문자 추가하기

문자를 하나씩 직접 초기화하는 경우에는 아래와 같이 널 문자를 수동으로 추가해야 합니다:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};

널 문자가 없으면 C의 문자열 처리 함수들이 올바르게 동작하지 않아 메모리 경계를 넘어 읽게 되고, 의도하지 않은 동작을 일으킬 수 있습니다.

3. 문자열 할당 방법

C에서는 문자열을 직접 다른 문자열에 할당할 수 없습니다. 한 문자열 변수의 내용을 다른 변수에 복사하려면 strcpy 함수를 사용합니다.

strcpy 기본 사용법

strcpy는 표준 라이브러리 <string.h>에 포함되어 있으며 다음과 같이 사용할 수 있습니다:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello";
    char destination[10];
    strcpy(destination, source);
    printf("Copied string: %sn", destination);
    return 0;
}

이 코드에서는 source의 내용이 destination에 복사되어 destination이 “Hello”를 갖게 됩니다. strcpy는 배열 크기를 고려하지 않으므로 버퍼 오버플로우에 주의해야 합니다.

4. 문자열 조작

C는 문자열 조작을 위한 여러 편리한 함수를 제공합니다. 아래에서는 strlen, strcat, strcmp와 같이 자주 사용되는 함수들을 살펴봅니다.

문자열 길이 얻기: strlen

문자열의 길이를 구하려면 strlen 함수를 사용합니다. 이 함수는 널 문자를 제외한 문자 개수를 반환합니다.

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    printf("String length: %zun", strlen(str));
    return 0;
}

문자열 연결: strcat

strcat 함수는 한 문자열을 다른 문자열 뒤에 붙입니다.

#include <stdio.h>
#include <string.h>

int main() {
    char greeting[20] = "Hello";
    char name[] = " World";
    strcat(greeting, name);
    printf("Concatenated string: %sn", greeting);
    return 0;
}

문자열 비교: strcmp

strcmp 함수는 두 문자열을 사전식으로 비교합니다. 두 문자열이 동일하면 0을 반환하고, 다르면 양수 또는 음수 값을 반환합니다.

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    int result = strcmp(str1, str2);
    if (result == 0) {
        printf("Strings are equal.n");
    } else {
        printf("Strings are different.n");
    }
    return 0;
}

이를 통해 문자열이 동일한지 여부를 확인하거나 사전 순서상의 위치를 판단할 수 있습니다.

5. 포인터를 이용한 문자열 처리

문자열은 포인터를 사용해서도 다룰 수 있습니다. 포인터를 이용하면 메모리 관리가 보다 유연해지지만, 잘못된 연산은 오류나 크래시를 일으킬 수 있으므로 주의가 필요합니다.

포인터를 이용한 문자열 할당

포인터를 사용할 때는 다음과 같이 선언하고 할당할 수 있습니다:

#include <stdio.h>

int main() {
    char *greeting = "Hello";
    printf("%sn", greeting);
    return 0;
}

보이는 바와 같이, 포인터는 문자열 리터럴을 직접 가리킬 수 있습니다. 그러나 문자열 리터럴의 내용은 수정할 수 없습니다.

6. 요약 및 주의사항

C 언어에서의 문자열 할당과 조작은 버퍼 오버플로나 잘못된 포인터 접근과 같은 미묘한 오류를 발생시키기 쉽습니다. strcpystrcat 같은 함수를 사용할 때, 항상 배열 크기를 고려하고 충분한 버퍼 공간을 할당하십시오. 마찬가지로, 포인터를 다룰 때 null 문자와 메모리 관리를 주의 깊게 처리하십시오. 올바르게 구현하면, 문자열 연산은 데이터 처리에 효과적인 도구가 될 수 있습니다.

年収訴求