使用电脑,手机或其他电子设备时我们经常会用到复制这个命令,那这个命令是如何实现的呢?
我们编写复制的程序:
void Mystrcpy1(char *desstr,char *srcstr)//把desstr和srcstr当作数组看待
{
int i;
for(i=0;srcstr[i]!='\0';i++)
{
desstr[i] = srcstr[i];
}
desstr[i] = '\0';
}
void Mystrcpy2(char *des,char *src)
{
int i;
for(i=0;*(src+i)!='\0';i++)
{
*(des+i) = *(src+i);
}
*(des+i) = '\0';
}
void Mystrcpy3(char *des,char *src)
{
while(*src != '\0')
{
*des = *src;
des++;
src++;
}
*des = '\0';
}
void Mystrcpy4(char *des,char *src)
{
while(*src != '\0')
{
*des++ = *src++;
}
*des = '\0';
}
void Mystrcpy5(char *des,const char *src)
{
while(*des++ = *src++) ;
}
下面呢,来介绍计算字符串长度的程序:
int Mystrlen(const char *str)
{
assert(str != NULL);
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
在这里我们计算的是字符串的有效长度,不包括'\0'。
最后呢是复制粘贴,就是将字符串str2复制到字符串str1之后:
char *Mystrcat(char *des,const char *src)
{
assert(des!=NULL && src!=NULL);
char *p = des;
while(*des!='\0')//找尾巴
{
des++;
}
while(*des++ = *src++);//复制
return p;
}
最最后,来了解一下字符串比较大小吧
int Mystrcmp(const char *str1,const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int gap;
while(((gap=*str1-*str2)==0) && (*str1!='\0'))
{
str1++;
str2++;
}
return gap;
}
以上就是我今天要介绍的程序,但是我们在编译的时候可能会出现一些问题,下面我就来总结一下问题及其原因:
int main()
{
//char str1[10] = "hello";
//char str2[] = "world";
//Mystrcat(str1,str2);
//printf("%s\n",str1);//程序在运行这四行时会出现崩溃,str1的长度是10个字节,将str2复制过去,一共有11个字节,出现越界,程序崩溃
//char *str1 = "abcde";
//strcpy("abcde","xyz");
char *str1 = "abcde";
char str2[] = "abcde";
str1[0] = 'x';//程序在运行时出现崩溃,str1是一个字符串常量,而str2是一个字符数组,不是同一类型,无法赋值给str1,程序崩溃
str2[0] = 'x';
printf("haha\n");
return 0;
}
下图是第二个问题的图解(红色代表地址):
大家要注意,str1保存的是字符串常量的地址哦,而不是字符串常量本身。