• 字符串拷贝函数


    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 }

     

     

    运行结果:

     

     

     

     

  • 相关阅读:
    SpringBoot处理跨域的四种方式
    centos部署nextcloud
    nginx反向代理时配置访问密码
    java对redis的基本操作
    springboot使用redis
    Linux安装redis
    centos安装php7.2环境 (亲测可用)
    linux下后台启动springboot项目
    全局加token
    web移动端浮层滚动阻止window窗体滚动JS/CSS处理
  • 原文地址:https://www.cnblogs.com/sjlove/p/3028015.html
Copyright © 2020-2023  润新知