当前位置:   article > 正文

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

字符数组拷贝

字符串拷贝作为经常考到的内容,其有不同的解决方法。
例如:将字符串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'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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'结尾
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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;//返回字符串
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

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

5:一步代码

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

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/563207
推荐阅读
相关标签
  

闽ICP备14008679号