复制,字符长度等问题

使用电脑,手机或其他电子设备时我们经常会用到复制这个命令,那这个命令是如何实现的呢?

我们编写复制的程序:

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保存的是字符串常量的地址哦,而不是字符串常量本身。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值