문자열 조작함수 직접 구현하기

언어로그/C/C++ 2011. 4. 29. 14:41



API를 이해하기 위한 가장 좋은 방법 중 하나는  직접 구현해보는 것이다 
 string.h  에서 지원하는  문자열 조작 함수들을 직접 구현해보았다.  이 함수들은 이름에 'str' 이라는 접두어를
가지고 있는데 직접 구현한 버전에는 "my_" 라는 접두어를 붙혔다. 




1. 문자열 함수들의 프로토 선언과 기능
 
  1. // 문자열 s의 길이를 반환하는 함수
  2. int strlen(char *s);      


    // s에 문자열 t를 복사하는 함수

  3. void strcpy(char *s, char *t);

  4. // 두 문자열을 비교하는 함수 : 같으면 0, 앞문자열이 크면 양수, 작으면 음수반환
  5. int strcmp(char *s, char *t);

  6. // 문자열 dest의 끝에 src 문자열을 연결하는 함수

  7. char *strcat(char *dest, const char *src)

  8. // 문자열 string에서 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
  9. char *strchr(const char *string, int c);

  10. // 문자열 string의 끝에서부터 문자 c를 찾아 위치를 반환하는 함수. 없으면 NULL 반환
  11. char *strrchr(const char *string, int c);

  12. // 문자열 string에서 문자열 strSearch를 찾아 첫번째 위치를 반환. 없으면 NULL 반환
  13. char *strstr(const char *string, const char *strSearch);

  14. // 문자열 string에서 strCharSet문자열에 속한 문자가 발견되면 그 위치를 반환. 없으면 NULL 반환
  15. char *strpbrk(const char *string, const char *strCharSet);

  16. //  문자열 str에서  delims 문자열에 속한 문자를 구분자로 분리해주는 함수. 첫번째 호출후
  17. //  NULL 을 주어 호출하면, 기존 문자열에서 계속 구분자를 기준으로 분리해서 반환해줌// 원 문자열을 변경하기 때문에 원치않다면 원문자열의 복사본을 사용해야 한다.
  18. char *strtok(char *str, const char *delims);




2. 문자열 조작 함수의 구현

my_string.c

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

int my_strlen(char *s);
void my_strcpy(char *s, char *t);
int my_strcmp(char *s, char *t);


char *my_strcat(char *dest, const char *src);
char *my_strncat(char *dest, const char *src,size_t count);

char *my_strchr(const char *string, int c);
char *my_strrchr(const char *string, int c);
char *my_strstr(const char *string, const char *strSearch);
char *my_strpbrk(const char *string, const char *strCharSet);


char *my_strtok(char *str, const char *delims);

int main (int argc, char const* argv[])
{
    char dest[1024] = "nice to meet you!";
    char *test = "my name is kimsungbae! what's up?";
    char *token;
    

    printf("strchr   : %s \n", strchr(test, '!'));
    printf("my_strchr: %s \n", my_strchr(test, '!'));
    printf("\n");
    
    printf("strrchr   : %s \n", strrchr(test, '\''));
    printf("my_strrchr: %s \n", my_strchr(test, '
\''));
    printf("\n");
    
    printf("strstr   : %s \n", strstr(test, "is"));
    printf("my_strstr: %s \n", my_strstr(test, "is"));
    printf("\n");
    
    printf("my_strcat : %s \n", my_strcat(dest, test));
    printf("my_strncat: %s \n", my_strncat(dest, "@@@@@@@@", 2));
    printf("\n");
    
    printf("strpbrk    : %s \n", strpbrk(test, "?!\'"));
    printf("my_strpbrk : %s \n", my_strpbrk(test, "?!\'"));

    token = my_strtok(dest, " ");
    printf("%s \n", token);
    
    while ((token = my_strtok(NULL" ")) != NULL) {
        printf("%s \n", token);
    }
    return 0;
}

int my_strlen(char *s) {
    char *= s;
    while (*p++ != '\0');
     
    return p - s;
}


void my_strcpy(char *s, char *t) {
    while (*s++ = *t++) ;
}

int my_strcmp(char *s, char *t) {
    for (; *== *t; s++, t++) {
        if (*== '\0') {
            return 0;
        }
    }
    return *- *t;
}

char *my_strcat(char *dest, const char *src) {
    char *p_dest = dest;
    
    while (*p_dest != '\0') {
        p_dest++;
    }
    
    while (*src != '\0') {
        *p_dest++ = *src++;
    }
    *p_dest = '\0';
    
    return dest;
}

char *my_strncat(char *dest, const char *src,size_t count) {
    char *p_dest = dest;
    
    while (*p_dest != '\0') {
        p_dest++;
    }
    
    while (*src != '\0' && count > 0) {
        *p_dest++ = *src++;
        count--;
    }
    *p_dest = '\0';
    
    return dest;
}

char *my_strchr(const char *str, int c) {
    while (*str != '\0') {
        if (*str == c) {
            return str;
        }
        str++;
    }
    return NULL;
}

char *my_strrchr(const char *str, int c) {
    char *p_str = str + strlen(str) - 1;
    
    while (p_str > str) {
        if (*p_str == c) {
            return p_str;
        }
        p_str--;
    }
    return NULL;
}

char *my_strstr(const char *str, const char *search) {
    char *start = NULL;
    
    while (*str != '\0') {
        if (start != NULL && *search == '\0') {
            break;
        }
        if (start != NULL && *str != *search) {
            start = NULL;
        }
        if (start == NULL && *str == *search) {
            start = str;
        }
        if (start != NULL && *str == *search) {
            search++;
        }
        str++;
    }
    return (start != NULL) ? start : NULL;
}


char *my_strpbrk(const char *str, const char *charset) {
    char *p_char;
    
    while (*str != '\0') {
        p_char = charset;
        while (*p_char != '\0') {
            if (*str == *p_char++) {
                return str;
            }
        }
        str++;
    }
    return NULL;
}


char *my_strtok(char *str, const char *delims) {
    static char *tmp, *pstart;
    char *p_delims;
    
    if (str != NULL) {
        tmp = str;
    }
    if (*tmp == '\0') {
        return NULL;
    }
    pstart = tmp;
    
    while (*tmp != '\0') {
        p_delims = delims;
        while (*p_delims != '\0') {
            if (*tmp == *p_delims++) {
                *tmp++ = '\0';
                return pstart;
            }
        }
        tmp++;
    }
    return pstart;
}

 


'언어로그 > C/C++' 카테고리의 다른 글

과제 #1 입출력,연산자  (0) 2011.06.13
음수의 표현  (0) 2011.06.13
문자열 조작함수 직접 구현하기  (2) 2011.04.29
라인 입출력 함수  (0) 2011.03.27
배열의 이해  (0) 2011.03.27
기억부류(Storage Class) / 변수  (0) 2011.03.27
  • 근혜 2016.11.21 03:52 ADDR 수정/삭제 답글

    strstr함수 문제가있는거같아요~ 확인해보세요

    • 로그 @로그 2016.12.07 11:08 신고 수정/삭제

      전체 문자열이 일치하는 경우 예외사항이 발생하고 있네요. ^^ 해당 케이스 수정했습니다. 감사합니다.