다양한 문자열 함수를 만들어보면서 원리를 이해해보았다!!
역시나 포인터를 사용해서 문자를 저장하고 비교하는 것이 핵심이었음!!
포인터에 좀 더 능숙해지자!
터미널에 main strncpy라고 치면 함수 원형이 나온다 이때
char strncpy(char dst, const char *src, size_t len)
여기에 size_t가 나오는데 알고 넘어가자!
typedef unsigned int size_t;
즉 부호없는 정수형을 뜻한다!! 0부터 42억 ~~얼마까지 적을 수 있는 녀석이다!
이론적으로 가능한 오브젝트의 최대 크기를 저장할 수 있는 타입이라고도 불린다
strlen의 특징
1. 문자열을 받으면 길이를 반환해주기!!
2. 문자열의 주소를 인자로 받아야함!
int mystrlen(const char* str) {
int cnt = 0;
while(*str != '\0') {
cnt++;
str++;
}
return cnt;
}
포인터 주소를 ++해주면 쉽게 이야기하면 한칸씩 옆으로 이동하는 것이다!
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의 특징
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의 특징
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의 특징
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;
}