zoukankan      html  css  js  c++  java
  • strcpy实现

    实现:
    char *strcpy(char *strDestination,const char *strSource)
    {
    assert(strDestination!=NULL && strSource!=NULL);
    char *strD=strDestination;
    while ((*strDestination++=*strSource++)!='');
    return strD;
    }
    
    
    
    
    
    有以下程序
    #include <stdio.h>
    #include <string.h>
    void main()
    {
        char s1[10],*s2="abcdef";
        strcpy(s1,s2);
        printf("%s",s1);
    }
    程序执行后的输出结果是_______。
    A)abcdef                           B)abcdef
      C)ab                                D)以上答案都不对
    答案:C
    strcpy(S1, S2); -->S1[0]='a',S1[1]='b',S1[2]=''
    原型声明:extern char *strcpy(char *dest,const char *src);
    实现:char *strcpy(char *dest,const char *src) 
    { 
      assert(dest && src); 
      char *string=dest; 
      while ((*dest++=*src++)!='') 
      NULL; 
      return string; 
    }
    
    19.  若有程序段: char str[ ]= "china"; char *p; p=str; 则下列叙述正确的是     。
    A)*p与str[0]相等
    B)str数组长度和p所指向的字符串长度相等
    C)str和p完全相同
    D)数组str中的内容和指针变量p中的内容相等
    答案:A
    p和s有区别,p本身申请的地址空间内存放的是s的首地址的内存空间,而str的连续内存空间内存放的是值china。
    
    
    22.有以下程序:
    #include <stdio.h>
    #include<string.h>
    void main( )
    {  
        char str[ ][20]={"Hello","Beijing"},*p=str[0];
        printf("%d
    ",strlen(p+20));
    }
    程序运行后的输出结果是       。
    A)0      B)5    C)7        D)20
    答案:C
    
    
    24.下面程序运行后的输出结果是        。
    #include <stdio.h>
    #include <string.h>
    void main( )
    { 
        char *p1,*p2,str[50]="ABCDEFG";
        p1="abcd";p2="efgh";
        strcpy(str+1,p2+1);
        strcpy(str+3,p1+3);
        printf("%s",str);
    }
    A)AfghdEFG      B)Abfhd   C)Afghd       D)Afgd
    答案:D
    
    
    
    
    c/c++中的strcpy函数问题
    char *strcpy(char *strDest, const char *strSrc);
    {
        assert((strDest!=NULL) && (strSrc !=NULL));   
        char *address = strDest;                    
        while( (*strDest++ = * strSrc++) != ‘0’ )      
           NULL ; 
        return address ;                           
    }
    以上是strcpy函数的原型。为什么局部变量address 在返回的时候没有被析构,以我的理解局部变量在函数结束后会被析构,也就是说address 返回的并不是strDest的地址。
    
    address的确出栈就不存在了。
    返回的是它的一个copy(地址),也就是原strDest地址。。。这个地址是出栈后存在的。
    如果address指向一个函数内定义的变量(非malloc),那么出栈后地址是不存在的。
    如,下面才是错误的(返回的地址不可用)。
    char *strcpy( const char *strSrc);
    {
    char buf[100];
    char *address = buf,p=buf;                 
    while( (*p++ = * strSrc++) != ‘0’ )   ; 
    return address ;                           
    }
    
    char * getstr(){
        char tmpstr[255];
        
        strcpy(tmpstr,&quot;------&quot;);
        return tmpstr;
    }
    为什么编译出现:
     function returns address of local variable!
    究竟什么意思?为什么返回本地地址就不可以?
    如果你学过编译原理的话,对这个问题就会很清楚了。
    你在函数里所定义的一个变量是临时变量,如char tmpstr[255]; 它仅在函数的生存期内有效。临时变量在函数被调用的时候分配所需的存储空间,在函数返回以后,这块空间会被系统收回派其它用场,所以返回它没有任何意义。
    正确的用法是:
    char * getstr(){ 
       char* tmpstr; 
       tmpstr=(char*) malloc(255);
       strcpy(tmpstr,&quot;------&quot;); 
       return tmpstr; 
    } 
    那就是将 char tmpstr[255]&#59; 声明写做: static char tmpstr[255]&#59; 即可.不过这样将加长&quot;静态存储区&quot;的长度, 所以更科学的方法应该是将函数声明改成 char *getstr( char *tmpstr )&#59; 即 tmpstr 由形式参数传入, 至于其空间嘛, 就不是 getstr 的责任了, 完全可以由外部分配. 另外我点评一下 taodale
    的做法: 这样做虽然可以,但是习惯不好,降低了函数模块的&quot;内聚性&quot;,谁上的厕所谁就冲马桶嘛! 另外, lylizm 的做法依赖于编译器, 本来嘛, 局部变量是存在于堆栈中的,那么对它的指针引用在堆栈不发生变化的前提下应该不会有问题, 但是,这不是 C 的语法所要求的, 所以并不可行/可靠, 换句话说, 这样做有三种结果: 
    1. 编译不能通过(因为编译器要求太严),
    2, 内容不正确(原因比较复杂),
    3, 正确. 事实上, 我在 SCO Unix 5.05 下就发现有这样的情况: (参见 lylizm 的例子) 在函数外部输出的内容为: [Hello World] 注意, 丢失了最后一个字符, 我曾经把 &quot;电话银行&quot; 中客户输入的密码就丢失了一位, 最后才查出是这个原因. 总之,
    1,当 tmpstr 较短时, 宜采用类似 static char tmpstr[6]&#59; 的写法&#59;
    2, 当 tmpstr 较长时, 宜采用外部分配, 外部回收, getstr() 处理指针的方法. malloc()出来的内存区如果程序没有通过free()释放,会一直存在,即使程序退出,也会继续存在,只是此时变成不可访问的无用内存了。而临时变量以及数组则有它严格的作用域,由编译器分配和释放内存
  • 相关阅读:
    python中字母的大小写转换
    十进制转换为16进制
    查找数组中出现次数超过一半的数
    leetcode二分查找
    leetcode 3 字符串
    leetcode链表篇
    leetcode数组篇
    重构二叉树
    矩阵的特征向量和特征值
    微软编程
  • 原文地址:https://www.cnblogs.com/timssd/p/4091011.html
Copyright © 2011-2022 走看看