字符串拷贝函数

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 }

 

 

 

运行结果:

 

 

 

 

 

posted @ 2013-04-18 14:38  Air Support  阅读(623)  评论(0编辑  收藏  举报