C语言 strlen,strcpy,strcat的使用及其模拟实现


1.strlen函数

1.1 strlen函数的使用

    strlen函数可以计算字符串中字符的个数,字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数,不包括‘\0’本身,strlen函数的参数指向的字符必须以‘\0’结束,因为字符个数不会为负数,所以strlen函数的返回值为size_t类型。strlen的头文件为<string.h>。

这里有一串有意思的代码,可以看一下。

#include <stdio.h>
#include <string.h>
int main()
{
 const char* str1 = "abcdef";
 const char* str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else
 {
 printf("srt1>str2\n");
 }
 return 0;
}

看完这串代码,可能会有人觉得这串代码的结果会是str1>str2,毕竟3-6<0,但是上面说了strlen的返回结果为无符号整型,所以无符号的-3将会是一个大于0且很大的数,这串代码的结果应该是str2>str1。

1.2 strlen函数的模拟实现

    strlen函数的模拟实现的方法也有很多种,下面将会列举出三种方式,这里就直接上模拟strlen函数的模拟函数,主函数就不写了。

第一种  计数器方式
int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
 count++;
 str++;
 }
 return count;
}

 因为字符串的结尾是‘\0’,其Ascll码值为0,所以可以将其作为循环的判断标志,在遇到‘\0’之前,每一个字符就会使count增加一次,记录下字符个数,达到模拟实现strlen的效果。

第二种  递归的方式
int my_strlen(const char * str)
{
 assert(str);
 if(*str == '\0')
 return 0;
 else
 return 1+my_strlen(str+1);
}

 这种方法可以不创建临时变量,直到str指到'\0'的位置,把每个1都加起来,算出字符个数,达到模拟实现strlen的效果。

第三种  指针-指针的方式
int my_strlen(char *s)
{
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
 p++;
 return p-s;
}

 指针减去指针会得到两个指针之间的(指针变量类型的字节数*相差个数)的字节数,而字符指针类型的字节数为1.所以可以用这种指针-指针的方式来模拟实现strlen的效果。

2.strcpy函数

2.1 strcpy函数的使用

    strcpy可以将一个字符串内容拷贝到另一个字符串中,和strlen函数很相似的是以源字符串‘\0’为结束标志,并且‘\0’也会被拷贝进去,需要注意的是目标字符串的空间要足够大,确保能够存下源字符串,目标字符串的空间可以被修改。

 2.2 strcpy的模拟实现

#include<stdio.h>
void mystrcmp(char* arr1, const char* arr2)\\目标字符串可以被修改,源字符串不可被修改
{
	while (*arr2 != '\0')\\拷贝以源字符串的'\0'为结束标志
	{
		*arr1 = *arr2;拷贝赋值
		arr1++;
		arr2++;
	}
}
int main()
{
	char arr1[10] = "";
	char arr2[10] = "abcdef";
	mystrcmp(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

 将源字符串的字符都赋值给目标字符串就可以达到strcpy模拟实现的效果。

3.stract函数

3.1stract函数的使用

    stract函数可以将一个字符串的内容追加到另一个字符串中,源字符串在目标字符串‘\0’处开始追加,追加过程是以源字符串的'\0'为结束标志,目标字符串的空间要足够大,确保能够追加下源字符串,目标字符串的空间可以被修改。

3.2 stract函数的模拟实现

#include<stdio.h>
void mystract(char* arr1, const char* arr2)\\目标字符串可修改,源字符串不可修改
{
	while (*arr1 != '\0')\\源字符串在目标字符串'\0'处开始追加
		arr1++;
	while (*arr2 != '\0')\\以源字符串'\0'结束追加
	{
		*arr1 = *arr2;追加赋值
		arr1++;
		arr2++;
	}
}
int main()
{
	char arr1[20] = "abcde";
	char arr2[20] = "fghij";
	mystract(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

与strcpy函数的模拟实现有很多相似的地方,多了一个追加初始位置。


总结

    以上就是strlen,strcpy,strcat的使用及其模拟实现的全部内容了,如果有错欢迎指出,喜欢的话,点赞,收藏,评论,蟹蟹。

  • 47
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值