首页 > 其他分享 >《初学C语言第9天》

《初学C语言第9天》

时间:2023-11-28 22:32:41浏览次数:30  
标签:src dest C语言 char 初学 arr2 arr1 strcpy

//如何写出好的、易调试的代码

//#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

相关文章

  • 学习C语言的感想
     进入大学,接触了C语言这一门课程,感觉新奇又有趣,作为一名C语言初学者,带着零基础的好奇心,踏上学习C语言之旅。通过这大半个学期的学习,对C语言有了新的认识,跟着老师的步伐走,学习了C语言程序设计概述、数据类型、运算符、表达式等知识,对这些知识有了一下想法:一、 数据类型,运算符和......
  • 高级语言程序设计(C语言)
    第一章.计算机的发展世界上第一台计算机1946年美国:ENIAC电子数字积分计算机电子管为主要元件,冯.诺依曼提出存储程序概念和二进制思想;1.四个发展时代1>第一代:20世纪50年代,主要采用真空电子管制造计算机2>第二代:20世纪50年代末期:出现了以晶体管为主要元件的第二代......
  • c语言中函数指针用法
    #include<stdio.h>#defineMAX10voidswap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}voidfun(int*height,int*age){intn=10;*height=n*10;*age=n*2000;}int*createArray(intsize){......
  • C语言(二):整型变量的数值范围
    #include<stdio.h>intmain(){ inta=0; while(a<a+1) { a++; } printf("int类型的最大值是:%d\n\n",a); printf("int类型的最大值+1是:%d\n\n",a+1); intb=0; while(b>b-1) { b--; } printf("int类型的最小值是:%d\n\n",b);......
  • 《初学C语言第8天》
    ////代码调试——调用堆栈//#include<stdio.h.>//voidtest2()//{// printf("hehe");//}//voidtest1()//{// test2();//}//voidtest()//{// test1();//}//intmain()//{// test();// return0;//}////研究程序死循环的原因//#include<stdio.h>//#in......
  • c语言中向函数传递二维矩阵的方法
    在C语言中,向函数传递二维数组有几种方式,这主要取决于二维数组的大小是否已知。下面是几种常见的方式:  1)如果二维数组的大小已知,那么你可以在函数参数中直接指定数组的大小。例如: voidfunc(intarr[10][10]){...} 在这个例子中,func函数接受一个10x10的二维数组作为参数......
  • 选择法排序——c语言
    #include<stdio.h>intmain(){inti,min,z,j,temp,k,n=11;intbe[]={1,4,6,9,13,16,19,28,40,100,0};scanf("%d",&z);be[10]=z;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++){if(be[min]......
  • c语言
    /**@Author:[email protected]*@Date:2023-11-1013:51:34*@LastEditors:[email protected]*@LastEditTime:2023-11-2709:19:51*@FilePath:\c-learn\zhizhen.c*@Description:这是默认设置,请设置`customMade`,打开k......
  • C语言调用C++类成员函数讲解和实例
    原文:https://blog.csdn.net/LxXlc468hW35lZn5/article/details/1257010071、问题成因C语言与C++调用问题原因主要在于C编译器和C++编译器的不同。C是过程式语言,C编译器编译后,函数在符号库中就是函数名,没有其他任何附加信息。而C++是对象式语言,支持函数重载,C++编译器编译后,在符号......
  • C语言笔记7
    数组是一组有序的、类型相同的数据的集合,这些数据被称为数据的元素。一维数组的定义类型说明符数组名【正整型常量表达式】说明:类型说明符:数组的类型。数组名同变量名命名规则相同。常量表达式指明数组中元素个数,必须大于0.可以是数值常量、符号常量和字符常量。例如:floa......