//如何写出好的、易调试的代码
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>//strcpy所需头文件
//int main()
//{
// //strcpy——字符串拷贝
// char arr1[] = "##########";
// char arr2[] = "bit";
// strcpy(arr1, arr2);//将arr2的内容拷贝到arr1里面
// printf("%s\n", arr1);
// printf("%s\n",arr2);
// return 0;
//}实现代码,模拟实现函数strcpy
//////------------6分
//#include<stdio.h>
//#include<string.h>
//void my_strcpy(char* dest, char* src)
//{
// while (*src != '\0')//(20-26:循环体),发现‘\0’停止拷贝,注意:‘\0’也要拷贝过去
// {
// *dest = *src;//字符解引用指针能访问一个字符。
// //将‘b’拿出来交给*dest第一个‘#’(目标空间的第一个空间)
// src++;//“指针++”向后走一步,跳过一个字符。让‘i’找到第二个‘#’
// dest++;//为下一次拷贝做准备
// }
// *dest = *src;//为了拷贝‘\0’(放在拷贝的第四块空间(第四个#的位置))
//}
//int main()
//{
// char arr1[] = "##########";
// char arr2[] = "bit";
// my_strcpy(arr1, arr2);//数组传惨传的是首元素地址
// //即(arr1的第一个)‘#’、(arr2的第一个字符)‘b’
// printf("%s\n", arr1);
// return 0;
//}
////------------7分
//#include<stdio.h>
//#include<string.h>
//void my_strcpy(char* dest, char* src)
//{
// while (*dest++ = *src++)//引用后置++(先使用后++)此代码执行3次后结果分别为‘b’‘i’‘t’(均为真),并拷贝过去
// { //执行到第四次时,拷贝‘\0’(为假)不执行代码,并结束循环,但是拷贝‘\0’
// ;//(47,48,49为while的空语句不可删除)
// }
//}
//int main()
//{
// char arr1[] = "##########";
// char arr2[] = "bit";
// my_strcpy(arr1, arr2);
// printf("%s\n", arr1);
// return 0;
//}
//// ////------------8分
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//void my_strcpy(char* dest, char* src)
//{
// //if (dest != NULL && src != NULL)//虽能规避问题,但是不能让我们直观错误出现在哪里--不采用
// //{
// // while (*dest++ = *src++)//引用后置++(先使用后++)此代码执行3次后结果分别为‘b’‘i’‘t’(均为真),并拷贝过去
// // { //执行到第四次时,拷贝‘\0’(为假)不执行代码,并结束循环,但是拷贝‘\0’
// // ;//(47,48,49为while的空语句不可删除)
// // }
// //}
// assert(dest != NULL);//断言
// assert(src != NULL);//断言
// while (*dest++ = *src++)//引用后置++(先使用后++)此代码执行3次后结果分别为‘b’‘i’‘t’(均为真),并拷贝过去
// { //执行到第四次时,拷贝‘\0’(为假)不执行代码,并结束循环,但是拷贝‘\0’
// ;//(47,48,49为while的空语句不可删除)
// }
//}
//int main()
//{
// char arr1[] = "##########";
// char arr2[] = "bit";
// my_strcpy(arr1, arr2);//若此处误传了空指针NULL(没有指向任何的有效位置),
// //而函数需要的是地址,当空指针直接传给src时,*src就是访问‘0’地址指向的那块空间,导致程序挂了
// //注意:在使用指针之前,一定要判断指针的有效性
// printf("%s\n", arr1);
// return 0;
//}
// // ////------------9分
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//void my_strcpy(char* dest,const char* src)//当while內部写反时,会组织代码运行,提前把代码的错误暴露给我们
//{ //因为是把src拷贝到dest里边去,所以源头:src不变,而目标:dest会改变。因此const只修饰src(保护源头)
// assert(dest != NULL);//断言
// assert(src != NULL);//断言
// while (*dest++ = *src++)//此处dest与src写反了
// {
// ;
// }
//}
//int main()
//{
// char arr1[] = "##########";
// char arr2[] = "bit";
// my_strcpy(arr1, arr2);
// printf("%s\n", arr1);
// return 0;
//}
//// ////------------10分(满分)
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>//strcpy:每一个这样的函数返回的都是目标字符串
////strcpy的功能是:要把源数据拷贝放到目标里面去,且最终要感受到目标的变化,即返回目标地址(将函数的返回类型变成对应的char*)
//char* my_strcpy(char* dest, const char* src)
//{
// char* ret = dest;//目标dest的起始位置
// assert(dest != NULL);//断言
// assert(src != NULL);//断言
// while (*dest++ = *src++)
// {
// ;
// }//此处dest与src写反了
// return ret;//此处返回地址时,返回目标地址:应返回目标的起始地址
// //(末尾地址没有任何意义,所以不返回,而dest++已运行多次,所以须在dest++之前就保存好dest的起始位置,即前面设置的ret)
//}
//int main()
//{
// char arr1[] = "##########";
// char arr2[] = "bit";//把bit拷贝放到arr1里面去了,拷贝进去的时候,返回的又是目标的起始地址,
// //返回之后,直接打印,就能看到拷贝过去的数据
// //my_strcpy(arr1, arr2);此代码返回的是arr1的目标起始地址,即可以把该函数的返回值放在printf里,直接进行打印
// printf("%s\n", my_strcpy(arr1, arr2));//该方法叫做:链式访问(是把一个函数的返回值作为另外一个函数的参数),
// //因此该函数的功能会更加非丰富1.返回值可以做另外一个函数的参数2.直接拿该函数的返回值检测目标内放的是不是我们想要是的数据
// return 0;
//}
//关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,
//与预编译指令相比,const修饰符有以下的优点:
//
//1、预编译指令只是对值进行简单的替换,不能进行类型检查
//
//2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性
//
//3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,
//这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
标签:src,dest,C语言,char,初学,arr2,arr1,strcpy From: https://blog.51cto.com/KKhahaha/8605236