第一个轮子MyString

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
/*
匹配前size个字符
*/
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
/*
将str2完整的追加到str1的末尾
*/
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;
}

/*
将str2的前length个字符追加到str1的末尾
*/
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
/*
将str2拷贝到str1中
*/
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;
}

/*
将str2的前length个字符拷贝到str1中
*/
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
/*
查找在str1中出现str2的位置
*/
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;
}

/*
查找在str1中出现str2前length个字符的位置
*/
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
/*
查找str1中第一次出现c的位置
*/
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;
}

/*
查找str1中最后一次出现c的位置
*/
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
/*
找到str1和str2中都有的第一个字符,返回其在str1中的位置
*/
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;
}

/*
找到第一个str1中存在,str2中不存在的字符,返回其在str1中的下标
*/
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;
}
}

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