鱼C论坛

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

字符串拷贝函数的实现

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

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

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

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

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

  8.     while(*tempSource){ // 字符串source的长度
  9.         sourceLen++;
  10.         tempSource++;
  11.     }
  12.     while(*tempObj){//字符串copyObj的长度
  13.         copyObjLen++;
  14.         tempObj++;
  15.     }
  16.     printf("%d\n",*tempSource);
  17.     printf("%d\n",*tempObj);
  18.     printf("%c\n",*source);
  19.     printf("%c\n",*copyObj);

  20.     tempSource = source;
  21.     tempObj = copyObj;

  22. //根据两个字符串的长度,分别采取不同的拷贝策略
  23. //两个字符串长度的不同,有必要考虑吗?
  24. //当source长度低于copyObj时,一直往source里面拷贝,会出现越界的问题吗?
  25.     if(sourceLen >= copyObjLen){
  26.         while(*tempObj){
  27.             *tempSource = *tempObj;
  28.             tempSource++;
  29.             tempObj++;
  30.         }
  31.         *tempSource = *tempObj;
  32.     }
  33. else{
  34.         while(*tempSource){
  35.             *tempSource = *tempObj;
  36.             tempSource++;
  37.             tempObj++;
  38.         }
  39.     }
  40. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-10 16:20:18 | 显示全部楼层

  1. void self_strcpy_2(char *source_1, char *dest_1){
  2.     //copy the context from source to dest
  3.     char *source = source_1;
  4.     char *dest = dest_1;
  5.     while(*source && *dest){
  6.         *dest = *source;
  7.         dest++;
  8.         source++;
  9.     }
  10.     if(!*source){
  11.         *++dest = *source;
  12.     }
  13. }
  14. char* self_strcpy_3(char *str1, const char *str2){
  15.     char *temp = str1;

  16.     while(*str1++ = *str2++){
  17.         
  18.     }
  19.     return temp;
  20. }
复制代码

上述两种实现都没有考虑字符串的长度,当一个字符串短另一个字符串长时,一直往里面拷贝,不会出现越界吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-10 17:34:29 | 显示全部楼层
char *source_1, char *dest_1都是指针,不是数组
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

使用道具 举报

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

就是说不考虑长度的话,有可能会覆盖位置的数据,这个覆盖的操作不一定总会被视为错误?
这样的话,感觉每次考虑长度还是稳妥些
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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