字符串拷贝函数的实现
本帖最后由 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++;
}
}
}
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;
}
上述两种实现都没有考虑字符串的长度,当一个字符串短另一个字符串长时,一直往里面拷贝,不会出现越界吗? char *source_1, char *dest_1都是指针,不是数组 会不会越界视情况而定, c++primerplus6程序清单测试write程序时,写的清楚, 如果连续声明几个变量的话, 可以修改数据, 但是数据会被写入附近的变量那里, 不会引起错误, 如果刚好写入程序执行的那里会访问冲突, 还有一种情况我那时测试时发现的, 只有一个变量的情况下, 返回值时出错, 可能写入时写入到了那里, 影响了数据。
梦想灬远帆 发表于 2020-6-10 17:34
char *source_1, char *dest_1都是指针,不是数组
谢谢您的回复,非常感谢
比如原本定义的字符串长度是5,当写入数据个数超出5个后,仍然往里面写东西,超出预定长度(5)的内存的内容被覆盖,这样会有风险吗?
个人感觉严格意义上要考虑长度,超出该长度后就不在进行拷贝了,但看了一些网上的经典代码,大家貌似都没有专门考虑长度,为什么呢?(感觉大家不考虑一定有其原因,可能有些知识是我不知道的) 13623753581 发表于 2020-6-10 17:49
会不会越界视情况而定, c++primerplus6程序清单测试write程序时,写的清楚, 如果连续声明几个变量的话,...
就是说不考虑长度的话,有可能会覆盖位置的数据,这个覆盖的操作不一定总会被视为错误?
这样的话,感觉每次考虑长度还是稳妥些
页:
[1]