C语言的学习扔了有大半年了吧,现在感觉好多东东又模糊了许多,趁闲来无事,整理一下C语言学过的知识点。首先从令人心力绞碎,恨得咬牙跺脚的指针开始吧,这个令人又爱又恨的家伙,曾令多少人为之奋斗却又心碎。在经历了一番风雨之后,却又对其爱之有加,器之弥重。
写一个字符串复制函数,来温习一下指针。不求有多精通,只求能留个脚印,证明我曾经涉足过。如有不足和改进的地方,希望不吝赐教。
1 #include <stdio.h> 2 #include <assert.h> 3 4 /* 5 *说明:方法一 6 *参数:dest 指向目的地址首地址,src 指向源地址的首地址 7 *返回:无返回值,通过dest指针修改目的地址内容 8 *异常:可能出现字符串的溢出,目的地址内存不足以满足源地址字符串 9 *改进:sizeof(dch[]) 判断一下字节数,与strlen(src)作比较,看目的内存是否满足, 10 *若不满足,则增加内存 11 */ 12 void strcpy(char* dest, const char* src) 13 { 14 assert( (dest!=NULL) && (src!=NULL) ); 15 while((*dest++ = *src++)!='\0') 16 { 17 //空函数体 18 } 19 } 20 21 /* 22 *说明:方法二,无返回值,方法一的改进版 23 *参数:dest 指向目的地址首地址,src 指向源地址的首地址 24 *返回:无返回值 25 *异常:可能出现字符串的溢出,目的地址内存不足以满足源地址字符串 26 *改进:sizeof(dch[]) 判断一下字节数,与strlen(src)作比较,看目的内存是否满足, 27 *若不满足,则增加内存 28 */ 29 void mstrcpy(char* dest, const char* src) 30 { 31 char c; 32 while((c=(*src++)) != '\0') 33 { 34 *(dest++) = c; 35 } 36 *dest=c; 37 } 38 39 /* 40 *说明:方法二,带有返回值 41 *参数:dest 指向目的地址首地址,src 指向源地址的首地址 42 *返回:返回拷贝好的地址 43 *异常: 44 */ 45 char* m_strcpy(char* dest, const char* src) 46 { 47 //注意这里的内存指向参数dest所在的内存,不是栈内存,因而可以在函数中返回 48 char*d = dest; 49 char c; 50 while((c=(*src++)) != '\0') 51 { 52 *(dest++) = c; 53 } 54 *dest=c; 55 return d; 56 } 57 58 /* 59 *说明:方法二的一个错误的版本,考察的是对指针本质的理解 60 *参数: 61 *返回: 62 *异常: 63 */ 64 char* m_strcpy_error(char* dest, const char* src) 65 { 66 char*d = dest; 67 char c; 68 while((c=(*src++)) != '\0') 69 { 70 *(d++) = c; 71 } 72 *d=c; 73 return d; 74 } 75 76 /* 77 *说明:方法三,方法二的改正版,使用的是指向指针的指针, 78 *对目的地址的内存进行数据的操作 79 *参数: 80 *返回值:无返回值 81 *异常: 82 *改正: 83 */ 84 void nstrcpy(char* dest, const char* src) 85 { 86 char** d = &dest; 87 char c; 88 while((c=(*src++)) != '\0') 89 { 90 *(*d)++ = c; 91 } 92 **d='\0'; 93 } 94 95 /* 96 *说明:方法三的错误版本 97 *参数: 98 *返回:返回的是函数的参数指针
99 *异常: 100 *改正: 101 */ 102 char* nstrcpy_error(char* dest, const char* src) 103 { 104 char **d = &dest; 105 char c; 106 while((c=(*src++) )!= '\0') 107 { 108 *((*d)++) = c; 109 } 110 **d='\0'; 111 return dest;//dest指针指向了数组最后的地址即储存'\0'的地址,所以得到的结果的空字符串 112 } 113 114 int main( void ) 115 { 116 char dch1[50]; 117 char dch2[50]; 118 char dch3[50]; 119 char sch[50]; 120 printf("input the string to be copyed\n"); 121 scanf("%s",sch); 122 strcpy(dch1,sch); 123 mstrcpy(dch2,sch); 124 nstrcpy(dch3,sch); 125 printf("strcpy : the copy string is : %s \n", dch1); 126 printf("mstrcy : the copy string is : %s \n", dch2); 127 printf("nstrcy : the copy string is : %s \n", dch3); 128 return 0; 129 }
运行结果: