字符串拷贝作为经常考到的内容,其有不同的解决方法。
例如:将字符串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);
}
以上为个人想法,有问题还请指教。