Implement str functions: strlen, strcpy, strstr and atoi

自己动手实现的四个库函数, 分别是:

  1. strlen
  2. strcpy
  3. strstr
  4. atoi

代码如下:

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include "dbg.h"
#include <string.h>
#include <string>
#include <assert.h>
#include <limits.h>
using namespace std;

/*
* 实现strlen,获取字符串长度
*/
size_t strlen(const char *str)
{
const char *s;
for (s = str; *s; s++) {}
return s - str;
}

/*
* 实现strcpy, 字符串拷贝函数
*/
char *strcpy(char *to, const char* from)
{
assert(to != NULL && from != NULL); // 注意边界条件
char *p = to;
while ((*p++ = *from++) != '\0');
return to;
}

/*
* 实现strstr, 子串查找函数
*/

char *str_str(const char *str, const char *sub)
{
assert(str);
assert(sub);

const char *str_p = str;
const char *start = str; // start记录匹配成功的位置
const char *sub_p = sub;

char *res = new char[100];
while (*start)
{
str_p = start;
sub_p = sub;

// 停止条件
// 1. 其中一个已经到达'\0'
// 2. 两个字符不相等
while (*str_p && *sub_p && *str_p == *sub_p)
{
str_p++;
sub_p++;
}

if (*sub_p == '\0')
{
//dbg(sub_p);
strcpy(res, start);
//dbg(res);
return res;
}

start++; // str指针后移
}
return NULL;
}

/*
* 实现atoi(), 将一个字符串转化为整数
* 边界数据:
* 1. 带有正负号的
* 2. 有空格的
* 3. 不是数字的,如字母
* 4. 溢出的数据
*/
int my_atoi(const char *str)
{
int num = 0;
int sign = 1;
const int len = strlen(str);
int i = 0, j = 0;
while (str[i] == ' ' && i < len) i++; // 1. 去除左边空格
// 2. 带有正负号
if (str[i] == '+') i++; // 正号直接过
if (str[i] == '-') // 负号需要记录下来
{
sign = -1;
i++;
}

// 3. 转换
for (; i < len; i++)
{
// 无效检测
if (str[i] < '0' || str[i] > '9')
break;
// 溢出检测
if (num > INT_MAX / 10 ||
(num == INT_MAX / 10 && (str[i] - '0') > INT_MAX % 10))
return sign == -1 ? INT_MIN : INT_MAX;

num = 10 * num + (str[i] - '0');
}
return sign * num;
}

int main(int argc, char *argv[])
{
// 1. strlen
char str[20] = "helloworld";
size_t res = strlen(str);
cout << "length: " << res << endl;
cout << "====================" << endl;

// 2. strcpy
char to[20];
strcpy(to, str);
cout << "to: " << to << endl;
cout << "====================" << endl;

// 3. strstr
char *sub = "or";
dbg(str_str(str, sub));
cout << "====================" << endl;

// 4. atoi
dbg(my_atoi("124153"));
dbg(my_atoi("-124153000000000000000000000000000"));
dbg(my_atoi("hhhh"));
dbg(my_atoi(" 132"));

return 0;
}

运行结果:
str

前两个并不难,第三个稍微要考虑一些东西,最后一个需要注意边界情况。