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

언어로그/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 신고 수정/삭제

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

Objective-C 문자열 조작 메서드

Objective-C 2011. 4. 29. 12:22



Objective-C 문자열 조작 메서드 중 몇가지에 대해서 알아보자. 

문자열 비교시 결과값을 위해 다음과 같은 enum 상수가 선언되어 있다. 

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

NSOrderedAscening은 좌측의 피연산자가 우측의 피연자보다 작다는 것을  
NSOrderedDescending은 좌측의 피연자가 우측의 피연자보다 크다는 것을
NSOrderedSame은 좌우측의 피연산자가 같다는 것을 나타낸다. 


다음은 문자열에 포함된 특정 문자열이나  NSArray 안에 특정 Object와 같이 범위를 지정하기 위해 사용되는 구조체이다. 
typedef struct _NSRange {
      NSUInteger location;   // start index
      NSUInteger length;     // location 위치부터의 길이 
} NSRange;




다음은 초 단위로 시간간격을 지정하기 위한 타입정의이다. 
typedef double NSTimeInterval;



이름만을 보고도 충분히 그 의미를 알수 있기 때문에 메서드에 대한 설명은 생략하겠다. (-_-;;)



문자열 비교 
- (NSComparisonResult)compare:(NSString *)aString

- (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString

- (BOOL)isEqualToString:(NSString *)aString
 
- (BOOL)hasPrefix:(NSString *)aString




문자열 접합 
- (NSString *)stringByAppendingString:(NSString *)aString

- (NSString *)stringByAppendingFormat:(NSString *)format ...





문자열 분할 
- (NSString *)substringToIndex:(NSUInteger)anIndex

- (NSString *)substringFromIndex:(NSUInteger)anIndex

- (NSString *)substringWithRange:(NSRange)aRange





문자열 검색
- (NSRange)rangeOfString:(NSString *)aString

- (NSRange)lineRangeForRange:(NSRange)aRange





문자열 치환 
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement






문자열 변환 
- (NSString *)capitalizedString

- (NSString *)lowercaseString

- (NSString *)uppercaseString

- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding

- (const char *)cStringUsingEncoding:(NSStringEncoding)encoding





문자열 토큰 분리 
- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator

- (NSArray *)componentsSeparatedByString:(NSString *)separator




'Objective-C' 카테고리의 다른 글

Objective-C 문자열 조작 메서드  (0) 2011.04.29
다중인자를 갖는 PerformSelector 메시지  (0) 2011.03.23
Protocol 과 Category  (0) 2011.03.22
Objective-C 훑어보기  (2) 2011.03.20
[Cocoa] Cocoa Design Pattern  (0) 2011.03.20
HMAC-SHA1 구현  (0) 2011.03.03