C 언어 문자열 함수 직접 구현해보기

구현할 함수: strlen(), strcpy(), strcat(), strcmp(), strstr(), memcpy(), memmove()

1. strlen()

구현 아이디어: 시작 주소부터 문자열을 순회하며 문자 개수를 기록하고, '\0'을 만나면 순회를 중단합니다.

구현 코드:

size_t custom_strlen(const char* str) {
    size_t count = 0;
    while (str[count] != '\0') {
        ++count;
    }
    return count;
}
2. strcpy()

구현 아이디어: 원본 문자열을 순회하며 각 문자를 대상 문자열에 복사하고, 원본 문자열이 '\0'에 도달할 때까지 반복합니다.

구현 코드:

char* custom_strcpy(char* dest, const char* src) {
    char* start = dest;
    if (dest == NULL || src == NULL) return NULL;
    while ((*dest++ = *src++) != '\0');
    return start;
}
3. strcat()

구현 아이디어: 먼저 대상 문자열을 '\0' 위치까지 순회한 후, 원본 문자열과 대상 문자열을 동시에 순회하며 원본 문자열의 각 문자를 대상 문자열에 복사합니다. 원본 문자열의 '\0'까지 복사해야 합니다.

구현 코드:

char* custom_strcat(char* dest, const char* src) {
    char* start = dest;
    if (dest == NULL || src == NULL) return NULL;
    while (*dest) {
        ++dest;
    }
    while ((*dest++ = *src++) != '\0');
    return start;
}
4. strcmp()

구현 아이디어: 두 문자열의 문자를 순차적으로 비교합니다. 비교하는 두 문자가 같지만 '\0'이거나 서로 다를 때까지 반복합니다. 문자열이 같으면 0을 반환하고, 같지 않으면 0이 아닌 값을 반환합니다. (str1 > str2이면 양수, 반대면 음수)

구현 코드:

int custom_strcmp(const char* str1, const char* str2) {
    if (str1 == NULL || str2 == NULL) return 0;
    while (*str1 == *str2) {
        if (*str1 == '\0') {
            return 0;
        }
        ++str1;
        ++str2;
    }
    return (unsigned char)*str1 - (unsigned char)*str2;
}
5. strstr()

구현 아이디어: 브루트 포스(Brute Force) 검색

구현 코드:

const char* custom_strstr(const char* str1, const char* str2) {
    if (str1 == NULL || str2 == NULL) return NULL;
    if (*str2 == '\0') {
        return str1;
    }
    const char* current = str1;
    while (*current) {
        const char* s1 = current;
        const char* s2 = str2;
        while (*s1 && *s2 && *s1 == *s2) {
            ++s1;
            ++s2;
        }
        if (*s2 == '\0') {
            return current;
        }
        ++current;
    }
    return NULL;
}

참고: 이 코드는 브루트 포스 방식을 사용하며, KMP 등의 알고리즘으로 최적화할 수 있습니다.

6. memcpy()

구현 아이디어: strcpy()와 기본적으로 동일하며, 변수 타입 변환에 주의합니다.

구현 코드:

void* custom_memcpy(void* dest, const void* src, size_t sz) {
    if (dest == NULL || src == NULL) return NULL;
    void* start = dest;
    while (sz--) {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return start;
}
7. memmove()

구현 아이디어: memcpy()와 유사하지만, 동일한 문자열 내에서의 복사를 지원해야 데이터 덮어쓰기 문제를 고려합니다. 따라서 dest < src인 경우와 dest >= src인 경우로 나누어 처리합니다. dest < src이면 낮은 주소부터 복사하고, dest >= src이면 높은 주소부터 복사합니다.

구현 코드:

void* custom_memmove(void* dest, const void* src, size_t sz) {
    if (dest == NULL || src == NULL) return NULL;
    void* start = dest;
    if (dest < src) {
        while (sz--) {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    } else {
        while (sz--) {
            *((char*)dest + sz) = *((char*)src + sz);
        }
    }
    return start;
}

태그: C 문자열 함수 strlen strcpy strcat

6월 8일 23:37에 게시됨