赞
踩
首先肯定先得写一下我的校园生活,我们从昨天开始了我们的大学军训,给我的感觉(军训还是很有意义的,但是应该在刚开学的时候进行最后,现在 军训我还十分的不习惯,严重影响我的作息),今天5点50就起床(不够睡,难受的),然后要训练一天,只有中午两个小时和晚上一会可以进行自己的安排,时间上来说是非常宝贵的,所以我们进入话题
#include<stdio.h>
int main()
{
char arr1[] = "abcdefghijk";
char arr2[20] = "abc";
strcpy(arr2, arr1);
printf("%s",arr2);
return 0;
}
#include<stdio.h> #include<assert.h> char* my_strcpy(char* dest, char* src)//所以我这可以用两个char*类型了指针来接收 { assert(dest && src);//这个的意思就是避免dest和src是空指针,(如果有了这个assert(断言),就可以使当它们其中之一有空指针的时候就会报错,避免程序运行不报错,但要注意引头文件) char* ret = dest;//写这步的好处和原因有两个 1.可以使我的dest发生改变的时候还有一个指针指向它,使我便与寻找 2.可以使我的返回类型变得更加完美,完美实现char*的返回值的目的 while (*src) { *dest = *src;//这个的意思就是把源头的字符赋值给目的地 dest++;//这两步一样就是使指针指向下一个字符,然后再循环 src++; } *dest = *src;//这步的目的就是因为上面那个循环的条件是 src!='\0',所以当src为'\0'时,循环就会停止,导致*dest = *src这步在最后不能实现,所以'\0'就没有拷贝到dest中,所以我最后还要再进行一步赋值 return ret; } int main() { char arr1[] = "abcdef"; char arr2[20] = "bcd"; my_strcpy(arr2, arr1);//因为数组就是首元素的地址,所以这边传上去的其实就是两个地址 printf("%s",arr2); return 0; }
#include<stdio.h> #include<assert.h> char* my_strcpy(char* dest, char* src)//同上 { assert(dest && src);//同上 char* ret = dest;//同上 while (*dest++ = *src++);//这步的还是解引用后直接复制的意思,只是放在了循环之中(意思为当src为'\0'时,dest也为'\0',并且'\0'的ASCII码值为0,所以为假,所以此时循环依然停止) return ret;//同上 } int main() { char arr1[] = "abcdef"; char arr2[20] = "bcd"; my_strcpy(arr2, arr1);//同上 printf("%s",arr2); return 0; }
#include<stdio.h> #include<assert.h> char* my_strncpy(char* dest, char* src, size_t num) { assert(dest && src);//同理 char* ret = dest; while (num) { *dest = *src; //复制 src++; //源地址往后+1 dest++; num--;//我所需要拷贝的字符数随着我的循环一直减减 } return ret; } int main() { char arr1[] = "abcdefgh"; char arr2[20] = " "; my_strncpy(arr2, arr1, 5); printf("%s", arr2); return 0; }
#include<stdio.h>
int main()
{
int i = 0;
int arr1[] = { 1,2,3,4,5 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, sizeof(arr1));
for (i = 0; i < 5; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
#include<stdio.h> void* my_memcpy(void* dest, const void* src, size_t num)//这个还是一个道理(不想写了),且因为源头数据是我要的(是不会被修改的,所以加一个const),这下我们把源头的数据拷贝到了目的地,最后返回目的地的地址,目的就是我们希望这个目的地的空间可以发生变化,所以返回类型我们就写void* { void* ret = dest; assert(dest && src);//这边不敢又不会理解(原理就是因为下面传上来一个首元素地址,我这边可以用数组接,但是也可以用指针接,所以我这个位置的dest肯定是一个指针(类型是空指针,原理就是因为我这个函数的要求)所以毫无疑问不敢写成*dest,不然就是解引用,我拿到的就成了一个地址了,不是指针了,那么这个 dest!=NULL ,就不知道是什么鬼了) while(num--)//像这种有要求拷贝num个字节的函数(基本上就必须用到num--,这个表达式,因为只有这样才可以实现我按照num个的要求去实现函数嘛) //也可以写成int i=count; while(i--);一个道理的 //下面这个东西就是可以让我的指针每次都向后移动一个字节(只有这样我才可以把每一个指针指向的字节都给拷贝过去) { *(char*)dest = *(char*)src;//这步的目的就是使我的两个指针是通过(char*)一个一个字节进行拷贝的,所以要把它们都给强制类型为char*指针,然后解引用(这样就是一个一个字符的拷贝) //下面这步要注意,因为如果是后置加加的话,后置的加加的优先级是比我的(强制类型转换是更高的),所以这边一定要把加加写成前置加加,(然后这边再说一遍,因为dest和src此时都是void*类型的指针,所以 不能直接写dest++和src++,因为空指针不能进行运算,所以要进行强制类型转换,然后才有前面那个优先级的问题) ++(char*)dest;//这个前置加加不要怕好吗,(意思就是先强制类型转换,再加加而已,谁让我是想让它一个一个字节走,没办法,所以要先强制类型转换再加加(如果后置加加的话就会导致,先进行了一步加加(使我的字节一下就跳了不止一个的字节(然后再进行一个字节一个字节这里就会出问题了)))) ++(char*)src;//这样就实现了使指针向后走一步的操作(按照正常思路,此时可以让指针走一步了,那就应该要让它可以循环起来,所以要写一个循环出来,把它放到循环里面) } return ret; } int main() { int i = 0; int arr1[] = { 1,2,3,4,5 };//但是要小心那种自己拷贝到自己的情况(因为这种情况会把前面那个字节内刚刚拷贝过去的内容给替换掉(就不是我原来那个需要的字节内容了,而是前前那个字节的内容,因为它把它替换掉了)) int arr2[5] = { 0 }; my_memcpy(arr2, arr1,sizeof(arr1));//这个是万能拷贝(字符,数组,数字,结构体,等等,都是可以拷的) for (i=0; i < 5; i++) { printf("%d ",arr2[i]); } return 0; }
#include<stdio.h> #include<assert.h> void* my_memmove(void* dest, void* src, size_t count)//这边这个size_t是重新定义过的(这边也有另一个意思就是无符号的意思(所以说明这边这个数一定是正数)) { void* ret = dest; assert(dest && src); if (dest < src) { //从前向后 while (count--) { *(char*)dest = *(char*)src;//数据交换,但是要注意点是要解引用和数据的强制类型转换,且这边的强制类型转换的目的是为了使我在拷贝数据时,是通过一个一个字节进行拷贝的,而不是4个4个,只有一个一个字节进行拷贝,这样我的拷贝内容才会完整和准确 ++(char*)dest;//一个道理,但是注意()的优先级大于++,所以++写在前面 ++(char*)src; } } else { //从后向前 while (count--) { *((char*)dest + count) = *((char*)src + count);//这个的意思就是为了可以得到我的最后一个数据,因为这个while循环是为了从后向前拷贝,所以一定要先找到dest和src的最后一个数据进行交换 } } return ret; } #include<stdio.h> int main() { int i = 0; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; memmove(arr + 2, arr, 20);//这个就是专门处理内存重叠情况的 for (i = 0; i < 10; i++) { printf("%d ",arr[i]); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。