[C] 배열과 포인터를 이용한 문자열의 차이와 문자열을 다루는 함수

김태희·2025년 2월 2일
0
post-thumbnail

배열과 포인터를 이용한 문자열의 차이와 문자열을 다루는 함수

C 언어에서 문자열을 배우며 헷갈렸던 내용과 문자열을 다루는 함수를 정리해보았다.


문자열과 NULL 문자

C 언어에서 문자열은 char 배열로 저장되며, 문자열의 끝을 나타내는 NULL 문자('\0')가 포함된다.

#include <stdio.h>

int main() {
    char str[] = "Hello"; // {'H', 'e', 'l', 'l', 'o', '\0'}
    printf("%s\n", str); // Hello 출력
    return 0;
}

printf("%s", str); 같은 함수는 NULL 문자('\0')를 만날 때까지 문자를 출력한다.
즉, char 배열에서 NULL 문자가 없다면, 예상치 못한 메모리 영역까지 읽어버릴 수 있어 조심해야 한다.


char * vs char[]

1. char[]

배열을 사용한 문자열 선언 방식이다.

char str1[] = "Hello"; // 스택 메모리에 저장됨
str1[0] = 'h'; // 변경 가능
  • 배열 크기가 자동으로 할당됨
  • 문자열 변경 가능
  • 스택(Stack) 메모리에 저장됨

2. char *

포인터를 사용한 문자열 선언 방식이다.

char *str2 = "Hello"; // 문자열 리터럴은 읽기 전용 메모리에 저장됨
// str2[0] = 'h'; // 오류 발생 가능
  • 문자열 리터럴(상수) 주소를 가리킴
  • 문자열을 변경하면 오류 발생 가능 (읽기 전용 영역이므로)
  • 데이터 영역(읽기 전용 메모리)에 저장됨

3. 동적 할당 (malloc)

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

int main() {
    char *str3 = (char *)malloc(6 * sizeof(char)); // 6바이트 동적 할당
    strcpy(str3, "Hello"); // 문자열 복사
    printf("%s\n", str3); // Hello 출력
    free(str3); // 메모리 해제 필수
    return 0;
}

이렇게 동적 할당을 하면 힙(Heap) 메모리를 사용하게 되며, 사용 후 반드시 free()로 해제해야 한다.


문자열 관련 함수

C 언어에서는 문자열을 다룰 수 있는 다양한 함수를 제공한다.

이 함수들을 사용하려면 <string.h> 헤더파일을 include 해야한다.


1. strlen() - 문자열 길이 반환

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

int main() {
    char str[] = "Hello, World!";
    printf("문자열 길이: %lu\n", strlen(str));
    return 0;
}

2. strcpy() - 문자열 복사

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

int main() {
    char src[] = "Hello";
    char dest[10];
    strcpy(dest, src);
    printf("복사된 문자열: %s\n", dest);
    return 0;
}

3. strcmp() - 문자열 비교

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

int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    
    int result = strcmp(str1, str2);
    if (result < 0) {
        printf("%s이(가) %s보다 앞에 있음\n", str1, str2);
    } else if (result > 0) {
        printf("%s이(가) %s보다 뒤에 있음\n", str1, str2);
    } else {
        printf("두 문자열이 같음\n");
    }
    return 0;
}

strcmp가 반환하는 값

  • 0: 두 문자열이 같음
  • 음수 값: 첫 번째 문자열이 두 번째 문자열보다 사전순으로 앞섬
  • 양수 값: 첫 번째 문자열이 두 번째 문자열보다 사전순으로 뒤섬

strcmp() 직접 구현하기

#include <stdio.h>

int my_strcmp(const char *s1, const char *s2) {
    while (*s1 && (*s1 == *s2)) {
        s1++;
        s2++;
    }
    return *(unsigned char *)s1 - *(unsigned char *)s2;
}

int main() {
    printf("비교 결과: %d\n", my_strcmp("apple", "banana"));
    return 0;
}
  • ‘a’ = 97

  • ‘A’ = 65

  • 대문자가 섞이는 순간 소문자보다 무조건 사전 기준으로 앞에 나온다고 판단한다.

  • 주로 같은값인지 비교할때 쓰는 함수이다. 그 이상으로 사용할 시에 대소문자에 따른 결과값 차이를 고려해야한다.


4. strcat() - 문자열 이어 붙이기

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

int main() {
    char str1[20] = "Hello";
    char str2[] = " World";
    strcat(str1, str2);
    printf("연결된 문자열: %s\n", str1);
    return 0;
}

5. strchr() - 특정 문자 찾기

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

int main() {
    char str[] = "Hello, World!";
    char *pos = strchr(str, 'W');
    if (pos) {
        printf("W의 위치: %ld\n", pos - str);
    } else {
        printf("문자 없음\n");
    }
    return 0;
}

6. strstr() - 특정 문자열 찾기

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

int main() {
    char str[] = "Hello, World!";
    char *pos = strstr(str, "World");
    if (pos) {
        printf("World의 위치: %ld\n", pos - str);
    } else {
        printf("문자열 없음\n");
    }
    return 0;
}

C에서는 문자열이라는 자료형이 없기에 char형 배열을 이용해야하기에 메모리나 '\0'이 나올때까지 실행한다는 점 등 개발자가 알고 신경써야하는 부분이 더 많은것 같다.

그래도 이렇게 C를 배우고나니까 나중에 C++이나 Java Python 등 다른 언어를 더 쉽게 이해할것같다.

0개의 댓글

관련 채용 정보