一、strlen函数以及模拟实现
- 函数使用
int main() { char arr[] = "abc"; int len = strlen(arr); printf("%d\n", len); return 0; }
- 函数介绍
字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’);
参数指向的字符串必须要以 ‘\0’ 结束;
注意函数的返回值为size_t,是无符号的。
- 函数源码
- size_t在中定义
typedef unsigned int size_t;
,是无符号的;
接收一个char类型的数据,用const修饰,保证指针指向的内容不能通过指针来改变。 - 模拟实现
//计数器方式 int my_strlen(const char* str) { int count = 0;//计数器 assert(str != NULL);//指针断言,确保指针的有效性 while (*str != '\0') { count++; str++; } return count; } //不能创建临时变量计数器 int my_strlen(const char * str) { if(*str == '\0') return 0; else return 1+my_strlen(str+1); } //指针-指针的方式 int my_strlen(char *s) { char *p = s; while(*p != ‘\0’ ) p++; return p-s; } int main() { char arr[] = "abc"; int len = my_strlen(arr); printf("%d\n", len); return 0; }
- 与strlen函数的区别
int main() { //因为strlen返回的是一个无符号数,所以打印 > if (strlen("abc") - strlen("abcedf") > 0) { printf("strlen >\n"); } else { printf("strlen <\n"); } //我们的模拟的函数返回的是一个int类型是有符号的,所以打印 < //如果我们想要和strlen一模一样,那就需要也返回一个无符号数 //把int改为size_t if (my_strlen("abc") - my_strlen("abcedf") > 0) { printf("my_strlen >\n"); } else { printf("my_strlen <\n"); } return 0; }
二、长度不受限制的字符串函数
1、strcpy函数以及模拟实现
- 函数使用
int main() { char arr[20] = { 0 }; strcpy(arr, "hello"); printf("%s\n", arr); return 0; }
- 函数介绍
源字符串必须以’\0’结束;
会将源字符串中的 ‘\0’ 拷贝到目标空间;
目标空间必须足够大,以确保能存放源字符串;
目标空间必须可变。
函数源码
- destination是目标的意思,也就是说destination这里放被替换的字符,即目标字符。source的意思是来源,就是source这里放替换字符,即源字符。所以strcpy接收两个参数,第一个参数为需要被替换的字符,第二个参数为替换字符;
- 模拟实现
char* my_strcpy(char* dest, char* src) { while (*dest++ = *src++) { ; } } int main() { char arr[20] = { 0 }; my_strcpy(arr, "hello"); printf("%s\n", arr); return 0; }
2、strcat函数以及模拟实现
- 函数使用
int main() { char arr1[20] = "hello"; char arr2[] = "world"; strcat(arr1, arr2);//字符串追加(连接) printf("%s\n", arr1); return 0; }
- 函数介绍
源字符串必须以’\0’结束;
目标空间必须有足够的大,能容纳下源字符串的内容;
目标空间必须可修改;
strcat函数不能自己追加自己。
函数源码
- 接收参数与strcpy是一样的。
- 模拟实现
char* my_strcat(char* dest, const char* str) { char* ret = dest; assert(dest && str);//断言,确保指针是有效的 //找到目标字符串中的\0 while (*dest) { dest++; } //追加源字符串 while (*dest++ = *str++) { ; } return ret;//strcat返回的是目标空间的起始地址,我们也返回目标空间起始地址 } int main() { char arr1[20] = "hello"; char arr2[] = "world"; my_strcat(arr1, arr2);//字符串追加(连接) printf("%s\n", arr1); return 0; }
3、strcmp函数以及模拟实现
- 函数使用
int main() { printf("%d\n", strcmp("abc", "abb")); printf("%d\n", strcmp("abc", "abc")); printf("%d\n", strcmp("abb", "abc")); return 0; }
- 函数介绍
第一个字符串大于第二个字符串,则返回大于0的数字;
第一个字符串等于第二个字符串,则返回0;
第一个字符串小于第二个字符串,则返回小于0的数字。
- 函数源码
- 模拟实现
int my_strcmp(const char* s1, const char* s2) { assert(s1 && s2); while (*s1 == *s2) { s1++; s2++; if ('\0' == *s1 || '\0' == *s2) { break; } } return *s1 - *s2; } int main() { printf("%d\n", my_strcmp("abc", "abb")); printf("%d\n", my_strcmp("abc", "abc")); printf("%d\n", my_strcmp("abb", "abc")); return 0; }
三、长度受限制字符串函数
1、strncpy函数以及模拟实现
- 函数使用
int main() { char arr1[20] = "abcdef"; char arr2[] = "qwer"; printf("%s\n", strncpy(arr1, arr2, 2)); return 0; }
- 函数介绍
拷贝n个字符从源字符串到目标空间;
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
函数源码
- 它比strcpy多了一个Count计数器,用来确定从原字符串中拷贝几个字符到目标空间。所以它被叫做长度受限制字符串函数,而strcpy被叫做长度不受限制的字符串函数。
- 模拟实现
char* my_strncpy(char* dest, char* src, int count) { while (*dest++ = *src++) { count--; } int i = 0; for (i = 0; i < count - 1; i++) { *dest++ = '\0'; } } int main() { char arr1[20] = "abcdefdef"; char arr2[] = "qwer"; my_strncpy(arr1, arr2, 6); printf("%s\n", arr1); return 0; }