鱼C论坛

 找回密码
 立即注册
查看: 1511|回复: 5

字符串拷贝函数的实现

[复制链接]
发表于 2020-6-10 16:17:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 guoquanli 于 2020-6-10 16:22 编辑
void self_strcpy(char *source, char *copyObj){//自己写的字符串拷贝函数
    char *tempSource = source;
    char *tempObj = copyObj;

    int sourceLen = 0;      // 记录字符串的长度 
    int copyObjLen = 0;
    printf("%c\n",*tempSource);
    printf("%c\n",*tempObj);

    while(*tempSource){ // 字符串source的长度
        sourceLen++;
        tempSource++;
    }
    while(*tempObj){//字符串copyObj的长度
        copyObjLen++;
        tempObj++;
    }
    printf("%d\n",*tempSource);
    printf("%d\n",*tempObj);
    printf("%c\n",*source);
    printf("%c\n",*copyObj);

    tempSource = source;
    tempObj = copyObj;

//根据两个字符串的长度,分别采取不同的拷贝策略
//两个字符串长度的不同,有必要考虑吗?
//当source长度低于copyObj时,一直往source里面拷贝,会出现越界的问题吗?
    if(sourceLen >= copyObjLen){
        while(*tempObj){
            *tempSource = *tempObj;
            tempSource++;
            tempObj++;
        }
        *tempSource = *tempObj;
    }
else{
        while(*tempSource){
            *tempSource = *tempObj;
            tempSource++;
            tempObj++;
        }
    }
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-10 16:20:18 | 显示全部楼层
void self_strcpy_2(char *source_1, char *dest_1){
    //copy the context from source to dest
    char *source = source_1;
    char *dest = dest_1;
    while(*source && *dest){
        *dest = *source;
        dest++;
        source++;
    }
    if(!*source){
        *++dest = *source;
    }
}
char* self_strcpy_3(char *str1, const char *str2){
    char *temp = str1;

    while(*str1++ = *str2++){
        
    }
    return temp;
}
上述两种实现都没有考虑字符串的长度,当一个字符串短另一个字符串长时,一直往里面拷贝,不会出现越界吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 17:34:29 | 显示全部楼层
char *source_1, char *dest_1都是指针,不是数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 17:49:50 | 显示全部楼层
会不会越界视情况而定, c++primerplus6程序清单测试write程序时,写的清楚, 如果连续声明几个变量的话, 可以修改数据, 但是数据会被写入附近的变量那里, 不会引起错误, 如果刚好写入程序执行的那里会访问冲突, 还有一种情况我那时测试时发现的, 只有一个变量的情况下, 返回值时出错, 可能写入时写入到了那里, 影响了数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-11 09:21:55 | 显示全部楼层
梦想灬远帆 发表于 2020-6-10 17:34
char *source_1, char *dest_1都是指针,不是数组

谢谢您的回复,非常感谢
比如原本定义的字符串长度是5,当写入数据个数超出5个后,仍然往里面写东西,超出预定长度(5)的内存的内容被覆盖,这样会有风险吗?
个人感觉严格意义上要考虑长度,超出该长度后就不在进行拷贝了,但看了一些网上的经典代码,大家貌似都没有专门考虑长度,为什么呢?(感觉大家不考虑一定有其原因,可能有些知识是我不知道的)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-11 09:24:18 | 显示全部楼层
13623753581 发表于 2020-6-10 17:49
会不会越界视情况而定, c++primerplus6程序清单测试write程序时,写的清楚, 如果连续声明几个变量的话,  ...

就是说不考虑长度的话,有可能会覆盖位置的数据,这个覆盖的操作不一定总会被视为错误?
这样的话,感觉每次考虑长度还是稳妥些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表