Article Directory
length
strlen()
strnlen_s()
int my_strlen(char * str) {
if(!str) {
return 0;
}
int i = 0;
while(*str++) {
i++;
}
return i;
}
int my_strnlen_s(char * str, int maxSize) {
if(!str) {
return 0;
}
int i = 0;
while(*str++ && i++ < maxSize) {
}
return i;
}
copy
strcpy()
strcpy_s()
strncpy_s()
int my_strcpy(char * dest, char * src) {
while(*src) {
*dest++ = *src++;
}
*dest = '\0';
return 0;
}
int my_strcpy_s(char * dest, int dest_len, char * src) {
int i = 0;
while(*src && i++ < dest_len) {
*dest++ = *src++;
}
*dest = '\0';
return 0;
}
int my_strncpy_s(char * dest, int dest_len, char * src, int max) {
int i = 0;
while(*src && i < dest_len && i++ < max) {
*dest++ = *src++;
}
*dest = '\0';
return 0;
}
connection
strcat_s()
strncat_s()
int my_strcat_s(char * dest, int dest_len, char * src) {
// 跳过已有字符
while(*dest) {
dest++;
}
// 开始复制至src结束 或 到达长度
int i=0;
while(*src && i++ < dest_len) {
*dest++ = *src++;
}
*dest = '\0';
if(!*src) {
// src未完全复制
return 1;
}
return 0;
}
int my_strncat_s(char * dest, int dest_len, char * src, int max) {
// 跳过已有字符
while(*dest) {
dest++;
}
// 开始复制至src结束 或 到达长度
int i=0;
while(*src && i < dest_len && i++ < max) {
*dest++ = *src++;
}
*dest = '\0';
if(!*src) {
return 1;
}
return 0;
}
Compare
No optional function
strcmp ()
strncmp ()
int my_strcmp(char * str1, char * str2) {
// 跳过相同部分
while(*str1 && *str2 && *(str1++) == *(str2++)) {
}
// str1是否到结尾
// 是 str2是否到结尾
// 是 相等 0
// 否 str2大 -1
// 否 str2是否到结尾
// 是 str1大 1
// 否 比较 -1或1
return !*str1?
!*str2?
0:
-1:
!*str2?
1:
*(--str1)<*(--str2)?-1:1;
}
int my_strncmp(char * str1, char * str2, int max) {
int i = 0;
// 跳过指定范围的相同部分
while(*str1 && *str2 && *(str1++) == *(str2++) && i++<max) {
}
return !*str1?
!*str2?
0:
-1:
!*str2?
1:
*(--str1)<*(--str2)?-1:1;
}
search for
strchr()
strrchr()
strstr()
char * my_strchr(char * str, int ch) {
do {
if(*str == ch) {
return str;
}
} while(*++str);
return NULL;
}
char * my_strrchr(char * str, int ch) {
// C不能从后先前 只能全部循环直到字符串结束 返回最后一个指针 未找到为NULL
char * p = NULL;
do {
if(*str == ch) {
p = str;
}
} while(*++str);
return p;
}
char * my_strstr(char * str, char * sub) {
// 完全循环匹配
do {
char * pStr = str;
char * pSub = sub;
while(*pStr && *pSub && *pStr == *pSub) {
pStr++;
pSub++;
}
if(!*pSub) {
return str;
}
} while(*++str);
// KMP
return NULL;
}
Unitization
strtok()
strtok_s()
char * my_strtok(char * str, char * delimiter) {
char * start_str = str;
char * start_delimiter = delimiter;
do {
delimiter = start_delimiter;
do {
if(*str == *delimiter) {
*str = '\0';
return start_str;
}
} while(*++delimiter);
} while(*++str);
return NULL;
}
char * my_strtok_s(char * str, char * delimiter, char ** p) {
// 非首次使用检测
if(!str && !(str = *p)) {
return NULL;
}
char * start_str = str;
char * start_delimiter = delimiter;
do {
delimiter = start_delimiter;
do {
if(*str == *delimiter) {
*str = '\0';
*p = ++str;
return start_str;
}
} while(*++delimiter);
} while(*++str);
*p = NULL;
return start_str;
}