目录
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;
}