zoukankan      html  css  js  c++  java
  • copy()函数技术推演

    /***
    str_copy.c
    ***/
    #include<stdio.h>
    
    void copy_str21(char *from, char *to)
    {
        for(; *from != ''; from++,to++)
        {
            *to = *from;
        }
        *to = '';
    
        return;
    }
    
    int main()
    {
        char *from = "abcd";
        char buf2[100];
        copy_str21(from,buf2);
        printf("buf2:%s
    ",buf2);
        return 0;
    }

    程序内存四区分析:

    char *from = "abcd";  操作系统在在常量区分配一个内存存放”abcd”,在栈区定义分配一块内存,取名位from,from指向的这块内存存储“abcd”的首地址。

    char buf2[100]; 操作系统在栈区分配一块内存,开头与栈区增长方向相反,大小为100个字节

    copy_str21(from,buf2);        程序进入到该函数中

    void copy_str21(char *from, char *to)        操作系统在继续在栈中分配两块内存,分别用to和from指向这两块内存。并且把mian函数中的from,to地址首部存放在该函数中分配到from,to指针指向的内存

    for(; *from != ''; from++,to++)

    {

           *to = *from;

    }

    copy_str21函数中from指针存储的地址是常量“abcd”的首地址,to指针存储的是mian函数中buf2数组的首地址。然后把from指针不断后移区内容赋值给to指针不断后移所指向的内存空间。

    *to = '';      由于buf2没有进行初始化,所以最后要在结束的时候把最后面的内存赋值0,作为C语言字符串的结尾。

    然后程序返回,copy_str21栈地址回收,主函数打印buf2字符数组。

    copy函数技术演练

    /***
    str_copy.c
    ***/
    #include<stdio.h>
    
    void copy_str21(char *from, char *to)
    {
        for(; *from != ''; from++,to++)
        {
            *to = *from;
        }
        *to = '';
    
        return;
    }
    
    void copy_str22(char *from,char *to)
    {
        for(;*from != '';)
        {
            *to++ = *from++;
        }   
        *to = '';
        return ;
    }
    
    void copy_str23(char *from,char *to)
    {
        while( (*to = *from) != '')
        {
            from++;
            to++;
        }
    }
    
    void copy_str24(char *from,char *to)
    {
        while((*to++ = *from++) != '')
        {
            ;
        }
    }
    
    void copy_str25(char *from,char *to)
    {
        while( (*to++ = *from++) );
    }
    int main()
    {
        char *from = "abcd";
        char buf1[100];
        char buf2[100];
        char buf3[100];
        char buf4[100];
        char buf5[100];
    
        copy_str21(from,buf1);
        printf("buf1:%s
    ",buf1);
        copy_str22(from,buf2);
        printf("buf2:%s
    ",buf2);
        copy_str23(from,buf3);
        printf("buf3:%s
    ",buf3);
        copy_str24(from,buf4);
        printf("buf4:%s
    ",buf4);
        copy_str25(from,buf5);
        printf("buf5:%s
    ",buf5);
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/shareWin/CAndC++/20190924$ gcc strcopy.c -o strcopy -g

    exbot@ubuntu:~/shareWin/CAndC++/20190924$ ./strcopy

    buf1:abcd

    buf2:abcd

    buf3:abcd

    buf4:abcd

    buf5:abcd

    /***
    copy_str.c
    ***/
    #include<stdio.h>
    
    int copy_str26_good(char *from,char *to)
    {
        if(from == NULL || to == NULL)
        {
            return -1;
        }
    
        while(*to++ = *from++);
    
        return ;
    }
    
    
    int copy_str27_verygood(char *from,char *to)
    {
        if(from == NULL || to == NULL)
        {
            return -1;
        }
    
        char *tempfrom = from;
        char *tempto = to;
        while(*tempto++ = *tempfrom++);
    
        return ;
    }
    int main()
    {
        int ret = 0;
        char *from = "abcd";
        char buf[100];
        char buf1[100];
    
        //传进来的指针如果被初始化指向null的话,是不需要被修改的
        //因为null和0是操作系统内部一块无法访问和修改的地址空间存储的
        //所以提前对传进来的指针进行判断,如果为null,则返回错误
        ret = copy_str26_good(from,buf);
        if(-1 == ret)
        {
            printf("ponit p or buf is null
    ");
        }
        else
        {
            printf("copy success buf = %s
    ",buf);
    }
    
    //不要轻易改变形参的值,要引入一个辅助的变量指针,把形参接过来
        ret = copy_str27_verygood(from,buf1);
        if(-1 == ret)
        {
            printf("ponit p or buf is null
    ");
        }
        else
        {
            printf("copy success buf1 = %s
    ",buf1);
        }
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/shareWin/CAndC++/20190924$ ./copy_str

    copy success buf = abcd

    copy success buf1 = abcd

  • 相关阅读:
    alpha冲刺9
    alpha冲刺8
    alpha冲刺7
    alpha冲刺6
    团队作业——随堂小测(同学录)
    alpha冲刺5
    alpha冲刺4
    alpha冲刺3
    设计模式——桥接模式
    Java基础——关键字
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11581295.html
Copyright © 2011-2022 走看看