开始造轮子

契机

在最近的学习中,感觉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;
}

首先我会抽时间慢慢实现各个字符串操作函数,其次选一些我感兴趣的函数进行实现,希望我能坚持下去


开始造轮子
https://carl-5535.github.io/2021/07/21/造轮子/开始造轮子/
作者
Carl Chen
发布于
2021年7月21日
许可协议