strlen的使用和模拟实现

strlen的原型是: size_t strlen(const char* str);, 功能是求字符串长度, 统计的是\0之前的字符个数.
需要注意的是:

  • 返回值是size_t无符号类型.
  • 参数指向的字符串必须是以'\0'结尾
size_t my_strlen1(const char* str) {
size_t count = 0;
assert(str != NULL);
while (*str != '\0') {
count++;
str++;
}
return count;
}
size_t my_strlen2(const char* str) {
assert(str != NULL);
char* start = str;
while (*str != '\0') {
str++;
}
size_t count = str - start;
return count;
}
size_t my_strlen3(const char* str) {
assert(str != NULL);
// 不创建临时变量
if(*str == '\0'){
return 0;
}
return 1 + my_strlen3(str + 1);
}
#include <assert.h>
#include <stdio.h>
int main() {
char arr[] = "abcdefg";
printf("%zd\n", my_strlen1(arr));
printf("%zd\n", my_strlen2(arr));
printf("%zd\n", my_strlen3(arr));
}

strcpy的使用和模拟实现

strcpy的原型是: char* strcpy(char* destination, const char* source);, 功能是将源字符串包含'\0'拷贝到目标字符串.
需要注意的是:

  • 源字符串必须以\0结束
  • 拷贝时会将源字符串的'\0'也拷贝到目标空间
  • 目标空间足够大, 以确保可以存放源字符串
  • 目标空间必须可修改
char* my_strcpy(char* dest, const char* src){
assert(dest && src);
char* ret = dest;
while((*dest++ = *src++)){

}
return ret;
}

strcat的使用和模拟实现

strcat的原型是: char* strcat(char* destination, const char* source);, 功能是将源字符串包含'\0'连接到目标字符串的末尾'\0'处.
需要注意的是:

  • 源字符串必须以\0结束
  • 目标字符串也得有'\0', 否则不知道从哪里开始连接
  • 拷贝时会将源字符串的'\0'也拷贝到目标空间
  • 目标空间足够大, 以确保可以存放源字符串
  • 目标空间必须可修改
#include <stdio.h>
char* my_strcat(char* dest, const char* src){
//1. 找到目标字符串的\0的位置
//2. 将源字符串拷贝过去
char* ret = dest;
if (dest == NULL || src == NULL) {
return ret;
}
while (*dest != '\0') {
dest++;
}
while((*dest++ = *src++)){

}
return ret;
}
int main() {
char arr1[20] = "hello ";
char arr2[] = "world";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}

思考: 使用这个函数能不能实现字符串和自己连接? 不行, src 的'\0'被修改了, 导致字符串拷贝不能正常结束

strcmp的使用和模拟实现

strcmp的原型是: int strncmp (const char* str1, const char* str2, size_t num );, 比较两个字符串的大小(比较的不是长度, 而是字符串中对应位置的ASCII码值 的大小)
需要注意的是:

  • C 语言只规定了 str1 > str2, 返回 > 0 的数, str1 < str2, 返回 < 0 的数, str1 = str2, 返回 0
#include <stdio.h>
int my_strcmp(const char* str1, const char* str2) {
assert(str1 && str2);
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2) {
return 1;
}
else if (*str1 < *str2) {
return -1;
}
}
int main(){
char arr1[10] = "hellc";
char arr2[10] = "hella";
unsigned num = strlen(arr2);
printf("%d\n", my_strcmp(arr1, arr2));
return 0;
}

以上均为长度不受限制的字符串函数, 那什么是长度受限制的字符串函数? 看下面:

写在最后

使用字符串库函数要包含string.h头尾文件哦, 自己动手试一试吧~