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

박경현·2023년 6월 24일
0

다양한 문자열 함수를 만들어보면서 원리를 이해해보았다!!

역시나 포인터를 사용해서 문자를 저장하고 비교하는 것이 핵심이었음!!

포인터에 좀 더 능숙해지자!

size_t에 대해 일단 알고 가자!

터미널에 main strncpy라고 치면 함수 원형이 나온다 이때

char strncpy(char dst, const char *src, size_t len)

여기에 size_t가 나오는데 알고 넘어가자!

typedef unsigned int size_t;
즉 부호없는 정수형을 뜻한다!! 0부터 42억 ~~얼마까지 적을 수 있는 녀석이다!

이론적으로 가능한 오브젝트의 최대 크기를 저장할 수 있는 타입이라고도 불린다

문자열의 길이를 계산하는 함수 -> strlen

strlen의 특징
1. 문자열을 받으면 길이를 반환해주기!!
2. 문자열의 주소를 인자로 받아야함!

int mystrlen(const char* str) {
	int cnt = 0;
    while(*str != '\0') {
    	cnt++;
    	str++;
    }
    return cnt;
}

포인터 주소를 ++해주면 쉽게 이야기하면 한칸씩 옆으로 이동하는 것이다!

문자열 비교하기 -> strcmp (사전순으로 앞일수록 작고, 뒤로 갈수록 크다!)

strcmp의 특징
1. 두개의 문자열 주소를 받아서 문자 한개씩 비교하기!
2. 같으면 return 0;을 해주기!
3. 다르면 return return str1 - str2; 이렇게!! -> 둘이 아스키가 다르기 때문에 0이 절대 안나옴!
4. while에서 무한 반복때 마지막 '\0'이 둘다 나오면 종료!!

int mystrcmp(const char *str1, const char *str2) {
	unsigned char c1, c2;
    
	while(1) {
    	c1 = *str1++;
        c2 = *str2++;
        if(c1 != c2) {
        	return c1 > c2 ? 1: -1;
        }
        if(!c1 && !c2) {
        	break;
        }
    }
    return 0;
}

부분 문자열 비교하는 함수 - strncmp

strncmp의 특징
1. 전체 문자열을 보는게 아니므로 어디까지 비교할지 n을 지정해주기!
2. n까지 봤을때 같으면 return 0;
3. 아니면 이것도 return str1-str2; 처럼 값을 출력해버리기!

int mystrncmp(const char *str1, const char *str2, size_t n) {
	int index = 0;
    while(index <n && ( (*(str1+index)) || (*str2+index) ) {
    	if(*(str1+index) != *(str2+index)) {
        	return *(str1+index) - *(str2+index);
        }
        index++;
    }
	return 0;
}

문자열 복사하는 함수 - strcpy

strcpy의 특징
1. src 문자열을 dst에 복사해서 넣기!
2. '\0'전까지 다 넣고 그 다음 마지막에 '\0'을 추가로 넣어주기!
3. 그리고 dst문자열을 리턴!

char *mystrcpy(char* dst, const char*src) {
	int index = 0;
    while(*src != '\0') {
    	dst[index] = src[index]; // *(dst+index)랑 같은말!
        index++;
    }
    dst[index] = '\0';
    return dst;
}

부분 문자열 복사 - strncpy

strncpy의 특징
1. 부분 복사니까 n개로 몇개까지 복사할지 지정!
2. 이게 복사하는 n이 src문자열보다 크면 나머지 부분을 '\0'으로 추가하자!
3. 그리고 dst를 리턴!

char* mystrncpy(char *dst, const char* src, size_t n) {
	int index=0;
    while(index<n && *(src+index) != '\0') {
    	*(dst+index) = *(src+index);
        index++;
    }
    while(index <n) {
    	*(dst+index) = '\0';
        index++;
    }
    return dst;
    
}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글