MyString
本篇将自己重新实现<string.h>中常用的一些函数,虽然strlen()、strcmp()、strcmp()以及不存在的startwith()和endwith()已经在开篇写过了,但还是在此做一个整理
strlen()
获取字符串的长度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int my_strlen(const char *str) { int i = 0;
if (NULL == str) { return -1; }
do { i++; }while (str[i] != '\0');
return i; }
|
strcmp()和strncmp()
字符串匹配函数,如果相同则返回0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
int my_strncmp(const char *str1, const char *str2, int size) { int str1_len = 0; int str2_len = 0;
if (NULL == str1 || NULL == str2) { return -1; }
str1_len = my_strlen (str1); str2_len = my_strlen (str2);
if ((0 == str1_len && 0 == str2_len) || 0 == str2_len) { return 0; }
if (str1_len < size || str2_len < size) { return -1; }
for (int i = 0; i < size; i++) { if (str1[i] == str2[i]) { continue; } else if (str1[i] > str2[i]) { return 1; } else { return -1; } } return 0; }
int my_strcmp(const char *str1, const char *str2) { int str1_len = 0; int str2_len = 0;
if (NULL == str1 || NULL == str2) { return -1; }
str1_len = my_strlen (str1); str2_len = my_strlen (str2);
if ((0 == str1_len && 0 == str2_len) || 0 == str2_len) { return 0; }
if (str1_len < str2_len) { return -1; }
for (int i = 0; i < str2_len; i++) { if (str1[i] == str2[i]) { continue; } else if (str1[i] > str2[i]) { return 1; } else { return -1; } } return 0; }
|
strcat()和strncat()
字符串连接函数,将第二个字符串追加到第一个字符串结尾
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
int my_strcat(char *str1,const char *str2) { int str1_len = 0; int str2_len = 0; int i = 0;
if (NULL == str1 || NULL == str2) { return -1; }
str1_len = my_strlen (str1); str2_len = my_strlen (str2);
if (str2_len < 0) { return -1; }
if (0 == str2_len ) { return 0; }
for (; i < str2_len; i++) { str1[str1_len + i] = str2[i]; }
str1[str1_len + i] = '\0';
return 0; }
int my_strncat(char *str1,const char *str2,int length) { int str1_len = 0; int str2_len = 0; int i = 0;
if (NULL == str1 || NULL == str2) { return -1; }
str1_len = my_strlen (str1); str2_len = my_strlen (str2);
if (str2_len <= 0 || str2_len < length) { return -1; }
for (; i < length; i++) { str1[str1_len + i] = str2[i]; }
str1[str1_len + i] = '\0';
return 0; }
|
strcpy()和strncpy()
字符串拷贝函数,将第二个字符串拷贝到第一个字符串中,我给字符串末尾加了结束符,防止出现一些异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
int my_strcpy(char *str1,const char *str2) { int str2_len = 0; int i = 0; if (NULL == str1 || NULL == str2) { return -1; }
str2_len = my_strlen (str2); if (str2_len <= 0) { return -1; }
if (0 == str2_len ) { return 0; }
for (; i< str2_len; i++) { str1[i] = str2[i]; } str1[i] = '\0';
return 0; }
int my_strncpy(char *str1,const char *str2,int length) { int str2_len = 0; int i = 0; if (NULL == str1 || NULL == str2) { return -1; }
str2_len = my_strlen (str2); if (str2_len < 0 || str2_len < length) { return -1; }
if (0 == str2_len ) { return 0; }
for (; i< length; i++) { str1[i] = str2[i]; } str1[i] = '\0';
return 0; }
|
strstr()和strnstr()
字符串查找函数,查找在第一个字符串中出现第二个字符串的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
char *my_strstr(const char *str1, const char *str2) { char *tmp = (char*)str1; char *s1, *s2;
if (NULL == str2) return((char *)str1);
while (*tmp) { s1 = tmp; s2 = (char *)str2;
while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; }
if (!*s2) { return tmp; }
tmp++; } return NULL; }
char *my_strnstr(const char *str1, const char *str2, int length) { int str2_len = my_strlen (str2); char *tmp = (char*)str1; char str2_tmp[length+1]; char *s1, *s2; if (str2_len < length) { return NULL; } else { my_strncpy(str2_tmp, str2, length); }
if (NULL == str2_tmp) return((char *)str1);
while (*tmp) { s1 = tmp; s2 = (char *)str2_tmp;
while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; }
if (!*s2) { return tmp; }
tmp++; } return NULL; }
|
strchr()和strrchr()
字符查找函数,分别查找在字符串中第一次出现字符的位置和最后一次出现字符的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
char *my_strchr(const char* str1, int c) { char *tmp = (char *)str1; if (c < 0) { return NULL; }
while (*tmp) { if (*tmp == c) { return tmp; } else { tmp++; } }
return NULL; }
char *my_strrchr(const char* str1, int c) { char *tmp = (char *)str1; char *s1 = NULL; if (c < 0) { return NULL; }
while (*tmp) { if (*tmp == c) { s1 = tmp; }
tmp++; }
return s1; }
|
strpbrk()和strspn()
strpbrk()函数为依次检测第一个字符串中的字符,如果字符在第二个字符串中也存在,返回字符的位置
strspn()函数为依次检测第一个字符串中的字符,如果字符在第二个字符串中不存在,返回字符所在的下标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
char *my_strpbrk(const char *str1, const char *str2) { char *tmp = (char*)str2; char *s1, *s2;
if (NULL == str2) return((char *)str1);
while (*tmp) { s1 = (char *)str1; s2 = tmp;
for (; *s1; s1++) { if (*s1 == *s2) { return s1; } } tmp++; }
return NULL; }
int my_strspn(const char *str1, const char *str2) { char *tmp = (char*)str1; char *s1, *s2; int i = 0; int flag = 0;
if (NULL == str2) return -1;
while (*tmp) { s1 = tmp; s2 = (char *)str2;
for (; *s2; s2++) { if (*s1 == *s2) { tmp++; i++; flag = 1; break; } flag = 0; }
if (!flag) { return i; } }
return -1; }
|
startwith()和endwith()
自己实现的检查字符串是以某个子串开头或结尾的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| int startwith(const char *str1,const char *str2) { int str1_len = 0; int str2_len = 0;
if (NULL == str1 || NULL == str2) { return -1; }
str1_len = strlen (str1); str2_len = strlen (str2);
if ((0 == str1_len && 0 == str2_len) || 0 == str2_len) { return 0; }
if (str1_len < str2_len) { return -1; }
if (0 == strncmp(str1,str2,str2_len)) { return 0; } else { return 1; } }
int endwith(const char *str1,const char *str2) { int str1_len = 0; int str2_len = 0; char *tmp = NULL;
if (NULL == str1 || NULL == str2) { return -1; }
str1_len = strlen (str1); str2_len = strlen (str2); tmp = (char *)str1;
if ((0 == str1_len && 0 == str2_len) || 0 == str2_len) { return 0; }
if (str1_len < str2_len) { return -1; } tmp += str1_len-str2_len; if (0 == strcmp(tmp,str2)) { return 0; } else { return 1; } }
|