字符串拷贝的几种解决方法

字符串拷贝作为经常考到的内容,其有不同的解决方法。
例如:将字符串str1中内容拷贝到str2中,可以通过循环结构将字符串str1中字符逐一拷 贝到str2中,当遇到’\0’时,跳出循环,即将src[i]!=’\0’作为判断条件
在这里插入图片描述
注:这里的判断条件str[i]用到数组,也可以使用指针,通过解引用
a: *[src+i]!=’\0’(for循环结构中的表达式)
在这里插入图片描述
如上图所示,数组名src表示指向该字符串数组的首地址。将下标为i的字符拷贝给des,通过src+i来实现将指针加i个单元格从而指向当前字符,再通过解引用进行字符拷贝。

b: *src!=’\0’(while循环结构中的表达式)
字符串后面还要以’\0’结尾,所以最后加入des[i]=’\0’。
在函数的形参列表中用到const目的防止原字符串数组被修改,只读。

具体的几种解决方法如下:

1:利用数组,通过i++遍历数组进行拷贝,直到src[i]==’\0’。

#include<stdio.h>
void Mystrcpy1(char *des,const char*src)
{
	int i;
	for(i=0;src[i]!='\0';i++)
	{
		des[i] = src[i];//将下标为i的字符依次拷贝给目标字符串des.
	}
	des[i] = '\0';//字符串des后面添加'\0'
}

2:利用指针,解引用,通过str+i移动指针。

void Mystrcpy2(char *des,const char*src)
{
	int i;
	for(i=0;*(src+i)!='\0';i++)
	{
		*(des+i) = *(src+i);//加i个单元格
	}
	*(des+i) = '\0';//以'\0'结尾
	}

3:改变循环方法,利用指针加法des++,src++向后移动指针,进行拷贝。
这里注释用到的断言,目的:判断表达式为真时,什么都不做,如果为假,程序崩溃,防止写测试用例时,传入空指针(无效的指针)。搭配if使用,在Debug编译命令下使用。

char * Mystrcpy3(char *des,const char*src)
{
    char *p=des;
   /*assert(des!=NULL&&src!=NULL);
    if(des==NULL ||src==NULL)
    {
         return ;
    }*/
	while(*src != '\0')
	{
		*des = *src;//将首地址字符拷贝到des首地址中
		des++;//向后移动一个单元格
		src++;//向后移动一个单元格
	}
	*des = '\0';//以'\0'结尾
	return p;//返回字符串
}

4:同3中的循环中的方法,将’='同"++"结合成一个表达式

void Mystrcpy4(char *des,const char*src)
{
	while(*src != '\0')
	{
		*des++ = *src++; 
		//等价*(des++) = *(src++),"++"与'*'的优先级相同,但是运算按从右至左
		//des++,src++表示指针每次向后移动一个单元格
		//再通过解引用将字符拷贝给目标字符串des.直到条件为假,退出循环
	}
	*des = '\0';
}

5:一步代码

void Mystrcpy5(char *des,const char *src)
{
	while(*des++ = *src++);
	//第一步先将src首地址中的字符拷贝给des,判断结果不为0(或者'\0'),为真,向后移动一个单元格。
   //第二步按第一步依次执行。直到*src指向'\0'将其拷贝给des,判断结果为'\0'==0。为假,退出循环。
   //程序结束。
}

6:主函数

int main()
{
	char str1[100];
	char str2[100];
	char str3[] = "abcde";
	char str4[]="ghijk"
	Mystrcpy1(str1,str3);
	printf("%s\n",str1);
	Mystrcpy2(str2,str4);
	printf("%s\n",str2);
	Mystrcpy3(str1,str3);
	printf("%s\n",str1);
	Mystrcpy4(str2,str4);
	printf("%s\n",str2);
	Mystrcpy5(str1,str3);
	printf("%s\n",str1);
}

以上为个人想法,有问题还请指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值