赞
踩
字符串拷贝作为经常考到的内容,其有不同的解决方法。
例如:将字符串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); }
以上为个人想法,有问题还请指教。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。