契机
在最近的学习中,感觉C库好像缺少了检查字符串是以某个子串开头或结尾的函数,于是自己手动实现了一个:
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; } }
|
看着这两个函数我陷入了沉思,既然缺少的我可以自己实现,那么已存在的我按照自己的想法重写,应该会对这些函数有一个更深的理解,于是便有了‘造轮子’这个专题
今天先将函数中用到的strlen()、strcmp()以及strcmp()进行重写
my_strlen()
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; }
|
my_strcmp() 和 my_strncmp()
strcmp()和strncmp()是进行字符串比较的函数,如果完全相同则返回0,如果出现不同字符,前字符串的字符大就返回1,否则返回-1.如下:
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
| 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; }
|
首先我会抽时间慢慢实现各个字符串操作函数,其次选一些我感兴趣的函数进行实现,希望我能坚持下去