文章目录
本章的内容主要讲解这4个与字符串相关的函数的原型、使用以及模拟实现
strlen的使用和模拟实现
函数的原型
size_t strlen ( const char * str );
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,所以结果不能为负数。
4.strlen的使⽤需要包含头⽂件string.h
strlen模拟实现:
方法1
//计数器方式
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
const char* str1 = "fallzzzzz";
int tmp = my_strlen(str1);
printf("lenth = %d\n", tmp);
return 0;
}
方法2
//不能创建临时变量计数器
//使用递归的方式
int my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
const char* str1 = "fallzzzzz";
int tmp = my_strlen(str1);
printf("lenth = %d\n", tmp);
return 0;
}
方法3
//指针-指针的⽅式
//指针-指针的结果是两指针之间的元素个数
int my_strlen(char* str)
{
char* p = str;
while (*p != '\0')
{
p++;
}
return p - str;
}
int main()
{
const char* str1 = "fallzzzzz";
int tmp = my_strlen(str1);
printf("lenth = %d\n", tmp);
return 0;
}
strcpy的使用和模拟实现
函数的原型
char * strcpy ( char * destination, const char * source );
我们把source称作源字符串
我们把destination称作目标字符串
该函数为拷贝函数,可以把源字符串拷贝到目标字符串
1.源字符串必须以 ‘\0’ 结束。
2.该拷贝会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.⽬标空间必须足够大,以确保能存放源字符串。
4.⽬标空间必须是可修改的,即不为const。
strcpy的模拟实现:
char* my_strcpy(char* dest, const char* src)
{
//用临时变量保存 因为之后dest和src的指针指向有变 无法直接返回指向首元素的指针
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while ((*dest++ = *src++))
{
//在while的循环条件中就完成了拷贝
//所以这里用空语句即可
;
}
return ret;
}
int main()
{
char str1[] = "fallzzzzz";
char str2[20];
char* tmp = my_strcpy(str2, str1);
printf("str2 = %s\n", tmp);
return 0;
}
strcat的使用和模拟实现
函数的原型
char * strcat ( char * destination, const char * source );
1.源字符串必须以 ‘\0’ 结束。
2.目标字符串中也得有 ‘\0’ ,否则没办法知道追加从哪里开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改,即目标字符串不为const类型。
该函数为追加字符串函数,能够在一个字符串之后追加上另一个字符串
strcat的模拟实现:
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest) //遇到'\0'停止
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char str1[] = "hello ";
char str2[] = "the ";
char str3[] = "fallzzzzz ";
char str4[50];
strcpy(str4, str1); //先将str1拷贝到str4,目的是让目标字符串中有'\0'
my_strcat(str4, str2);
my_strcat(str4, str3);
puts(str4); //将字符串(以‘\0’结束的字符序列)输出
return 0;
}
strcmp的使用和模拟实现
函数的原型
int strcmp ( const char * str1, const char * str2 );
该函数为字符串的大小比较函数,比较的是两个字符串中对应位置上的字符的ASCII码值的大小。
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字
strcmp的模拟实现
int my_strcmp(const char* str1, const char* str2)
{
int ret = 0;
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
//在*str1 == *str2的条件下,其中一个为'\0',那么另一个也为'\0'
//两个都访问到'\0',那么就说明这两个字符串是相等的,所以跳出循环 返回0
return 0;
}
str1++;
str2++;
}
return *str1 - *str2; //将ASCII码值相减的结果作为返回值 就能通过该字符ASCII码值的大小关系比较出字符串的大小关系
}
int main()
{
char* str1 = "hello";
char* str2 = "fallzzzzz";
int tmp = my_strcmp(str1, str2);
printf("%d", tmp);
return 0;
}