C语言字符串专题一:重写字符串拷贝函数、字符串连接函数以及求字符串长度函数

本篇文章均是一些比较基础的C语言字符串操作,欢迎大家阅读!!

一、重写求字符串长度函数(代码如下)

//求字符串长度 
int my_strlen(const char *str){     //加const变为只读型
	assert(str!=NULL);  //断言指针不为空,头文件:#include<assert.h>
	int sum=0;
	while(*str!='\0'){
		sum++;
		str++;
	}
	return sum;
}

关于断言:assert(str!=NULL);   //若str不为空,程序正常向下执行;若str指针为空,调用 abort(); 终止程序。

二、常见字符串赋值错误(请大家看下列程序)

#include<stdio.h>
main(){
	char stra[10]={"xiaoxin"};
	char strb[]={"xiaobai"};
	const char *sp="hello";
	strb="hello"; //出错!! 
	return 0;
}

出错原因:strb指的是字符数组首元素地址,地址是常量!!常量不能被赋值!!

关于数组名单独出现情况:除了sizeof(str); //括号内的str指整个数组,其余任何地方出现的数组名均代表数组首元素地址!!!

三、重写字符串拷贝函数(代码如下)

1.较为清晰的写法:

#include<stdio.h>
#include<assert.h>
void my_strcpy(char *dest,const char *src){
	assert(src!=NULL&&dest!=NULL);//对函数形参进行健壮性检查(断言不为空!)
	while(*src!='\0'){
		*dest=*src;
		src++;
		dest++;
	}
	*dest='\0'; //别忘了给dest字符数组赋结束标志'\0'!
}
int main(){
	char stra[30]={"hello"};
	char strb[30];
	my_strcpy(strb,stra);
	printf("%s",strb);
}

2.改写不同版本的my_strcpy()函数(将所有不同种的都写在下面的代码段)

//第二种 
void my_strcpy(char *dest,const char *src){
    assert(dest!=NULL&&src!=NULL);
	while(*dest=*src){  
	//赋值语句有返回值,返回的是被赋值后的结果。当赋完'\0'时返回'\0'的ASCII码值0(假),不再进入循环,已全部赋值。
		dest++;
		src++;
	}
}

//第三种
void my_strcpy(char *dest,const char *src){
    assert(dest!=NULL&&src!=NULL);
	while(*dest++ = *src++);
	//将赋值、自增语句全写在一条语句中。(*dest)++ = (*src)++;
	//此句话实现了:1.*dest=*src;(由于先赋值,所以可以将'\0'赋值。)  2.dest++;  src++;
}

//第四种
void my_strcpy(char *dest,const char *src){
	assert(dest!=NULL&&src!=NULL);
	int i=0;
	while(src[i]!='\0'){       //也可以写成*(src+i)!='\0'
		dest[i]=src[i];        //*(dest+i)=*(src+i);
		i++;
	}
	dest[i]='\0';
}

3.下面这种比较严谨,不在原基础上做改动(代码如下)

char* my_strcpy(char *dest,const char *src){
	assert(dest!=NULL&&src!=NULL);
	char *cp=dest; //通过字符指针cp指向并改变dest指向的内容 
	while(*src!='\0'){
		*cp=*src;
		cp++;
		src++;
	}
	*cp='\0';
    return dest;
}

四、重写字符串连接函数(代码如下)

char *my_strcat(char *dest,const char *src){
	assert(dest!=NULL&&src!=NULL);
	char *cp=dest+my_strlen(dest); //要连接这两个字符串,所以cp指向dest数组'\0'位置(用已定义的函数:dest+my_strlen(dest)),再直接一一赋值即可
    //同样是通过字符指针cp指向并修改dest指向的内容(不可以直接修改原值!) 
	while(*src!='\0'){
		*cp=*src;
		cp++;
		src++;
	}
	*cp='\0';
	return dest;
	/*
	//也可以直接调用已定义过的函数my_strcpy()进行赋值(拷贝) 
	assert(dest!=NULL&&src!=NULL);
	char *cp=dest+my_strlen(dest);
	my_strcpy(cp,src);
	return dest;
	*/ 
}

五、总结 

完整代码:

#include<stdio.h>
#include<assert.h>
int my_strlen(const char *str){  //求字符串长度 
	assert(str!=NULL);
	int sum=0;
	while(*str!='\0'){
		sum++;
		str++;
	}
	return sum;
}
char *my_strcpy(char *dest,const char *src){   //字符串拷贝函数 
	assert(src!=NULL&&dest!=NULL);
	char *cp=dest;  //建议还是设置新的字符指针! 
	while(*src!='\0'){
		*cp=*src;
		cp++;
		src++;
	}
	*cp='\0';
	return dest;
}
char *my_strcat(char *dest,const char *src){   //字符串连接函数 
	assert(dest!=NULL&&src!=NULL);
	char *cp=dest+my_strlen(dest); //这里是重点! 
	my_strcpy(cp,src);
	return dest;
}
int main(){
	char stra[30]={"xiaoxin"};
	char strb[30]={"hello"};
	char strc[30];
	printf("stra:%s\n",stra);
	printf("strb:%s\n",strb);
	int len=my_strlen(my_strcpy(strc,my_strcat(stra,strb)));
	printf("stra:%s\n",stra);
	printf("strb:%s\n",strb);
	printf("strc:%s\n",strc);
	printf("strc len:%d",len); 
	return 0;
}

运行结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值