strlen
返回字符串长度,不包含 ‘\0’
size_t my_strlen(const char* str) {
// 校验参数的合法性
//if (str == NULL) {
// // 操作
//}
// 还有一种方法是 assert"断言"
assert(str != NULL);// 条件成立,无事发生,否则程序崩溃
size_t size = 0;
while (str[size] != '\0') {
size++;
}
return size;
}
strcpy
拷贝字符串,把 src 指向的字符串拷贝到 dest 数组,要求 dest 的空间足够大以包含源字符串以及 ‘\0’
char* my_strcpy(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
strcat
字符串拼接,将 src 指向的内容(包含 ‘\0’ )拷贝一份追加到 dest 的末尾,dest 末尾的 ‘\0’ 被 src 的首字符覆盖;另外要求 dest 指向的内存空间要足够大,dest 和 src 不能重叠
char* my_strcat(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
// 找到 dest 的结束位置
int destEnd = 0;
while (dest[destEnd] != '\0') {
destEnd++;
}
// 把 src 拷贝到 dest 的末尾
strcpy(dest + destEnd, src);
return dest;
}
strcmp
按照字典序比较字符串str1,str2的大小。如果 str1<str2,函数返回一个负数;如果 str1=str2,函数返回0;如果 str1>str2,函数返回一个正数。
int my_strcmp(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
// 依次比较每个字符之间的大小关系
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 < *str2) {
return -1;
}else if (*str1 > *str2) {
return 1;
}else {
//比较下一个字符
str1++;
str2++;
}
}
// 循环结束后,有一个字符串遇到了 '\0'
if (*str1 < *str2) {
return -1;
}
else if (*str1 > *str2) {
return 1;
}
else {
return 0;
}
}
strncpy
- 当 num 比 src 长的时候,会在后面额外补充 ‘\0’
- 当 num 比 src 短的时候,只拷贝 src 的前 num 个字符(不含’\0’)
- num 的数值要保证 dest 能够容纳下含 ‘\0’ 的空间大小
char* my_strncpy(char* dest, const char* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
assert(num != 0);
size_t i = 0;
while (src[i] != '\0' && i < num) {
dest[i] = src[i];
i++;
}
// 循环结束有两种情况
// 1、src遇到了 \0,把 dest 剩余的部分都设为 \0
// 2、i==num,函数结束
while (i < num) {
dest[i] = '\0';
i++;
}
return dest;
}
strncat
拷贝 src 的前 num个字符追加到 dest,并加上 ‘\0’
char* my_strncat(char* dest, const char* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
assert(num != 0);
// 先找到 dest 的末尾
size_t destEnd = 0;
while (dest[destEnd] != '\0') {
destEnd++;
}
size_t i = 0;
while (src[i] != '\0' && i < num) {
dest[destEnd + i] = src[i];
}
// 循环结束有两种可能
// 1.src[i]=='\0',再追加一个\0
// 2.i==num,再追加一个\0
dest[destEnd + i] = '\0';
return dest;
}
strncmp
以字典序比较 str1 和 str2 的前 num 个字符大小
int my_strncmp(const char* str1, const char* str2, size_t num) {
assert(str1 != NULL);
assert(str2 != NULL);
assert(num != 0);
size_t i = 0;
while (str1[i] != '\0' && str2[i] != '\0' && i < num) {
if (str1[i] < str2[i]) {
return -1;
}
else if (str1[i] > str2[i]) {
return 1;
}
else {
i++;
}
}
// 循环结束有三种可能
if (i == num) {
return 0;
}
if (str1[i] < str2[i]) {
return -1;
}
else {
return 1;
}
}
strstr
判断 str2 是否为 str1 的字符串子串
const char* my_strstr(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
assert(str1 != '\0');
assert(str2 != '\0');
const char* black = str1;
while (*black != '\0') {
const char* red = black;
const char* sub = str2;
while (*red != '\0' && *sub != '\0' && *red == *sub) {
red++;
sub++;
}
if (*red == '\0' || *red == *sub) {
black++;
continue;
}
if (*sub == '\0') {
return black;
}
}
return NULL;
}