1. (string length)
1.1功能
计算字符串的长度
size_t strlen ( const char * str );
注意:不计算 ' \0 ' 例如:
char arr[]="nihenNB" //我们知道这种初始字符串,编译器会在后面自动添加'\0' //长度为7+1=8 printf("%d",strlen(arr)); //打印的结果为7,不计算'\0'
1.2模拟实现strlen
(一共有三种方法),可以对比一下
int my_strlen(char* arr)//计数器的方式 { int n = 0; while (*arr != '\0') { n++; arr++; } return n; } int my_strlen2(char* arr)//不创建临时变量的计数器方法 { //试用嵌套 if (*arr == '\0') { return 0; } else { return 1 + my_strlen2(arr + 1); } } int my_strlen3(char* arr)//使用指针的方法 { char* p = arr; while (*p++ != '\0') { ; } return p - arr - 1; } int main()//模拟实现strlen { char arr[] = "i am shan haonan."; printf("%d\n", my_strlen3(arr)); return 0; }
2.strcpy(string copy)
char* strcpy(char * destination, const char * source );
2.1功能:复制字符串
返回目的指针,可以实现链式访问(复制的地方,复制的内容)
注意:
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。
学会模拟实现。
2.2模拟实现
#include<stdio.h> #include<string.h> char* my_strcpy(char* arr2,char *arr1)//返回的值为arr2 { //while (*arr1!='\0') //{ // *arr2 = *arr1; // arr2++; // arr1++; //} //上述代码可以简化内下: char* arr = arr2; while (*arr2++ = *arr1++) { ; } return arr; } int main()//模拟实现strcpy { char arr1[] = "hello"; char arr2[20] = "0"; //strcpy(arr2, arr1);//将arr1的内容拷贝到arr2中 my_strcpy(arr2, arr1); printf("%s\n", arr2); return 0; }
3.strcat
char * strcat ( char * destination, const char * source );
3.1功能
目标空间的后面添加新的内容
源字符串必须以 '\0' 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
字符串自己给自己追加,如何?
3.2模拟实现
#include<stdio.h> #include<string.h> #include<assert.h> char* my_strcat(char* des, char* res) { assert(des != NULL); assert(res != NULL); char* p = des; while (*des!= '\0') { des++; } //while (*res!='\0')//字符串复制 //{ // *des = *res; // des++; // res++; //} //上述代码简化版本: while (*des++ = *res++) { ;//当赋值/0的时候,括号内相当于0为假,自然就结束了循环 //但是要注意结束循环的时候 des和res又一次++ } return p; } int main()//模拟实现strcat { char arr[20] = "helllo"; char arr2[] = " sb"; //printf("%s\n",strcat(arr, arr2)); printf("%s\n",my_strcat(arr, arr2)); return 0; }
4.strcmp
int strcmp( const char * str1, const char * str2);
3.1功能
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
3.2模拟实现
#include<stdio.h> #include<string.h> #include<assert.h> int my_strcmp(char* arr1, char* arr2) { assert(arr1 && arr2); while (*arr1 == *arr2) { arr1++; arr2++; } return (*arr1 - *arr2); } int main()//模拟实现strcmp { char arr1[] = "hello"; char arr2[] = "hallo"; //如果arr1>arr2返回>0 //printf("%d", strcmp(arr1, arr2)); printf("%d", my_strcmp(arr1, arr2)); return 0; }
5.strstr
char * strstr ( const char *str1, const char * str2);
5.1功能:
判断是否str2是str1的字串,如果是,则该函数返回str2在str1中首次出现的地址;
否则,返回NULL。
5.2模拟实现
#include<stdio.h> #include<string.h> #include<assert.h> char* my_strstr(char* des, char* res) { assert(des && res); char* flag = des; while (*flag!='\0') { char* s1 = flag; char* s2 = res; while (*s1 == *s2) { s1++; s2++; if (*s2 == '\0') { return flag; } } flag++; } return NULL; } int main()//模拟实现strstr,查找是否存在子字符串 { char arr[] = "abcdedef"; char arr2[] = "def"; //printf("%s\n",strstr(arr, arr2));//返回的是arr的内部字串的地址 my_strstr(arr, arr2); printf("%s\n", my_strstr(arr, arr2)); return 0; }