目录
一.常用字符串函数介绍
1.strlen
2. strcpy
3.strcmp
4.strcat
5.strstr
二.模拟实现常用字符串函数
1.strlen
2.strcpy
3.strcmp
4.strcat
5.strstr
一.常用字符串函数介绍
1.strlen
字符串strlen是用来求字符串长度的,我们可以打开cpp网站查看有关信息
该函数用来求字符串长度,求的是‘\0’之前字符的个数,函数参数为字符指针,因为该函数不需要修改字符串的值,故为了保护字符串被意外修改,设置为只读,所以在参数字符指针用const修饰,返回值即为字符串的长度,
下面以经典helloworld字符串为例:
输出结果:
字符串arr1为“helloworld”,一个10个字符,该字符串长度则为10,输出结果正确
2. strcpy
字符串函数strcpy是用来拷贝字符串的,即将一个字符串的内容拷贝到另一个字符串中,而且会将该字符的'\0'也拷贝到另一个字符串中,我们打开cpp网站查看该函数的有关信息
该函数的参数为两个字符指针,一个指向目标字符串,一个指向源字符串,由于只需要修改目标字符串,故用const修饰源字符串以防止误修改,函数返回值是目标字符串的首地址
下面以经典helloworld字符串为例:
输出结果:
可以看到我们将arr2中的helloworld成功地拷贝到了arr1中,但特别值得注意的是,当目标字符串空间不够时,强行拷贝比空间更大的字符串,虽然也可以输出结果,但毕竟是越界访问,会引发一些不可估计的问题,如将本例的arr1大小由10改为5:
可以看到程序运行后,虽然正常地打印出了结果,但是程序出错了
3.strcmp
字符串函数strcmp函数是用来比较两个字符串大小的,但是并不是比较两个字符串的大小,而是比较字符串的内容,如果第一个字符串小于第二个字符串,则返回一个小于0的值,大于则返回一个大于0的值,等于则返回0,如“hello”和“hellz”,前面的字符都相等,‘o’小于‘z’,故"hello"小于“hellz”,如“hellx”和"hella",前面的字符都相等,'x'大于'a',所以“hellx”大于“hella”
打开cpp网站查看该函数的相关信息
该函数的参数为两个字符指针,由于比较不需要修改字符串,所以两个参数都用const修饰以防误修改 返回值为int型,比较的结果为小于则为小于0的值,大于则为大于0的值,等于则为0
下面以经典的helloworld字符串为例
输出结果:
4.strcat
字符串函数strcat是用来连接两个字符串的,即将源字符串连接到目标字符串后面,连接的步骤是先找到目标字符串的末尾‘\0’,然后再进行拷贝,所以与strcpy的区别就在于要从目标字符串的末尾开始拷贝
打开cpp网站查看该函数的相关信息:
该函数的参数为两个字符指针,由于源字符串不需要修改,故加上const修饰以防误修改,返回值为连接后的字符串的地址,即目标字符串的地址
下面以经典的helloworld字符串为例:
输出结果
可以看到我们成功地将arr2的“world”连接到arr1的“hello”中,于是arr1便变成了“helloworld”,与拷贝函数类似,特别值得注意的是,目标字符串要有足够大的空间,否则强行连接的话会出现一些未知的错误
我们将上例的arr1的大小改为8:
输出结果:
可以看到虽然正常输出了,但是程序报错了
5.strstr
字符串函数strstr是查找函数,在字符串中查找子串并返回子串在字符串第一次出现的地址,如果找不到子串则返回NULL
打开cpp网站查看该函数的相关信息
该函数的参数为两个字符指针。由于查找并不需要修改两个字符串的内容,所以两个字符指针都用const修饰,返回值为子串在字符串中第一次出现的地址
下面以经典的helloworld字符串为例:
输出结果:
可以看到“llo”可以在“helloworld”中找到,并返回指向“llo”’的地址,将改地址用%s打印,则从llo开始打印 ,即为lloworld
二.模拟实现常用字符串函数
1.strlen
my_strlen模拟实现库函数strlen。参数为const char *,返回值为int型,即为字符串的长度,利用遍历字符串的方法,直到‘\0’结束遍历
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strlen(const char* str)
{
int len = 0;//定义长度,初始化为0
while (*str != '\0')//从头开始遍历字符串,直到'\0'结束
{
len++;
str++;
}
return len;//返回字符串的长度
}
int main()
{
char arr1[] = "helloworld";
int ret = my_strlen(arr1);
printf("%d", ret);
return 0;
}
2.strcpy
利用my_strcpy模拟实现库函数strcpy,依次赋值,直到源字符串遍历到'\0"结束赋值,并返回预留的目标字符串的地址
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcpy(char* str1, const char* str2)
{
char* p = str1; //定义一个p指针保存str1,以便函数结束时返回
while (*str1 = *str2)//依次赋值,直到*str2为'\0'结束
{
str1++;
str2++;
}
return p;//返回预留的指针P
}
int main()
{
char arr1[20] = {0};
char arr2[] = "helloworld";
char *str = my_strcpy(arr1,arr2);
printf("%s", str);
return 0;
}
3.strcmp
利用my_strcmp函数模拟实现库函数strcmp,依次遍历比较,如果遇到不相等的情况则直接return返回,如果两个字符串相等,则遍历到'\0'再返回0
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int my_strcmp(const char* str1, const char* str2)/*要是不相等,下面的return会结束循环,
要是相等,则遍历到'\0'才结束*/
{
while (*str1 != '\0' || *str2 != '\0')
{
if (*str1 < *str2) //小于则返回-1
return -1;
else if (*str1 > *str2)//大于则返回1
return 1;
else if (*str1 == *str2)//相等则继续比较后面的字符
{
str1++;
str2++;
}
}
return 0;//只有相等才会执行到这一步,即相等返回0
}
int main()
{
char arr1[] = "helloworla";
char arr2[] = "helloworld";
int ret = my_strcmp(arr1,arr2);
printf("%d", ret);
return 0;
}
4.strcat
利用my_strcat函数模拟实现库函数strcat,先找到目标字符串的末尾‘\0’,然后从'\0'处依次赋值,直达遍历到源字符串的末尾'\0'
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strcat(char* str1, const char* str2)
{
char* p = str1;//保存连接字符串的地址,以便函数结束时返回
while (*str1 != '\0')//遍历找到str1的'\0'处
{
str1++;
}
while (*str1 = *str2)//从str1的'\0'处依次赋值,直到遍历到str2的'\0'结束
{
str1++;
str2++;
}
return p;//返回连接后字符串的地址
}
int main()
{
char arr1[20] = "hello";
char arr2[] = "world";
char *str = my_strcat(arr1,arr2);
printf("%s", str);
return 0;
}
5.strstr
利用my_strstr函数模拟实现库函数strstr,设置两个指针分别指向两个字符串,再设置一个指针P指向当前开始比较的字符的位置,直到遍历到子串的'\0'位置则已找到子串并返回子串的位置,循环节后仍咩=没有找到子串则说明找不到子串,返回NULL
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = str1;//定义s1指向第一个字符串
const char* s2 = str2;//定义s2指向第二个字符串
const char* p = str1;//定义p指向第一个字符串当前开始比较的字符
while (*p)
{
s1 = p; //从p处开始比较
s2 = str2;//从头开始比较
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//判断遍历字符是否相等
{
s1++;
s2++;
}
if (*s2 == '\0')//如果是因为*s2为'\0'结束,则证明找到子串,返回子串的位置
return p;
p++;//一轮比较后没有找到子串,则从下一个字符开始比较
}
return NULL;
}
int main()
{
char arr1[] = "helloworld";
char arr2[] = "llo";
char *str = my_strstr(arr1,arr2);
printf("%s", str);
return 0;
}