字符串库函数(1)Strlen,strcpy,strcat,strcmp

C语言没有字符串类型.字符串通常放在常量字符串或字符数组中(字符串常量适用于不做修改的字符串函数。
结束标志为‘\0’

运行时一直到 '\0'时才结束,所以运行起来不是太安全

strlen

计算字符串长度
用例:

int main()
{	
	int len = strlen("KFCCrazyThursdayVme50");
	printf("%d\n", len);
	return 0;
}

原理:strlen获取字符串地址,从第一个字符开始向后找'\0',找不到计数器就加1,直到找到'\0'为止。上述输出为21。

错误用例:

int main()
{	
	char arr[] = { 'k','f','c','v','m','5','0' };
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

输出结果为74,这个结果实际为随机的一个值,

因为这样定义的arr里结尾没有 '\0'

strlen找不到就一直往后找,直到找到'\0'为止。

所以strlen计算的字符串一定要以'\0'结尾。

自己实现strlen函数

1.计数器方法

int my_strlen(const char* str)
{
	int a=0;//引入计数器
	while (*str)//str的值为0(\0)时自动结束
	{
		a++;
		str++;
	}
	return a;
}

2.递归法(不创建临时变量的方法)

int my_strlen(const char* str)
{
	if (*str != '\0')
		return 1 + my_strlen(++str);
	else
		return 0;
}

注意:使用strlen函数时,若出现以下情况时

	if(strlen("abc")- strlen("abcde")<0)
		printf("aaaa");

输出不了结果

因为strlen返回值类型为无符号数

以下的函数:strcat,strcpy,strcmp是长度不受限制的字符串函数

strcpy

字符串拷贝

用例

int main()
{	
	char arr1[]="covermeaaaa";
	char arr2[]="coveryou";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

原理:取得两个字符串地址后从第一个字符开始拷贝,直到遇到'\0',

因此strcpy函数处理的复制源头的字符串也必须含有 '\0'

自己实现strcpy

char* my_strcpy(char* pre,const char* re)
{
	while (*pre++=*re++)
	{
	};
	return pre;
}

(while(*pre++=*re++)中,同时进行了赋值,指针值增加,判断循环进行

使代码更简洁。

注意点:(假设函数为 strcpy (arr1,arr2)  )

1.arr2中必须包含'\0',不然会造成越界访问

2.arr1中空间必须比arr2大,否则空间不足

3.arr1不能为常量字符组,无法改变常量字符组的内容,函数无法运行

strcat

字符串追加

用例

int main()
{	
	char arr1[20]=" 哼哼";
	char arr2[]="啊啊啊啊啊";
	strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

原理

导入arr1指针后,指针向后移动到'\0'从\0开始进行与strcpy一样的操作

自己实现strcat

char* my_strcat(char* pre,const char* re)
{
	while (*pre!='\0')
	{
		pre++;
	}
	while (*pre++=*re++)
	{
	};
	return pre;
}

注意(在strcat(arr1,arr2)中)

1.保证arr1空间足够

2.追加时arr2中的'\0'会一起加上去,且arr2中必须包含‘\0'

strcmp

字符串的比较

用例

int main()
{	
	char arr1[]="wwwwww";
	char arr2[]="QAQaaa";
	int a = strcmp(arr1, arr2);
	printf("%d", a);
	return 0;
	
}

该函数是从两数组第一个字符开始,对比两字符的ASCII码值

从第一个开始,

若arr1>arr2的字符ASCII则返回一个正数

若arr1<arr2的字符ASCII则返回一个负数

若arr1=arr2的字符ASCII则跳至下一个字符

直到比较出大小

或者到两个字符都是'\0'时返回0

自己实现strcmp

int my_strcmp(const char* p1,const char* p2)
{
	while (p1==p2)
	{
		if (p1 == '\0')//判断此时两字符串是否到最后一位都相等
			return 0;
		p1++;
		p2++;
	}
	if (*p1 > *p2)
		return 1;
	if (*p2 > *p1)
		return -1;
}

注意:

VS编译系统下返回的正数是1,负数是-1,不同编译系统不一样

在其他编译系统下若要返回随机正负值

可以如下设置

int my_strcmp(const char* p1,const char* p2)
{
	while (p1==p2)
	{
		if (p1 == '\0')//判断此时两字符串是否到最后一位都相等
			return 0;
		p1++;
		p2++;
	}
	return (*p1-*p2);
}

自己学完网课后总结的可能不太完善 (′~`;)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值