• 写出完整版的strcpy函数及其他如:strcat,strcmp,strstr的函数实现


     (---牛客网中刷题---)写出完整版的strcpy函数

    如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:  
    2分

    1
    2
    3
    4
    void strcpychar *strDest, char *strSrc )
    {
      while( (*strDest++ = * strSrc++) != ‘’ );
    }

    4分  

    1
    2
    3
    4
    5
    void strcpychar *strDest, const char *strSrc ) 
    //将源字符串加const,表明其为输入参数,加2分
    {
      while( (*strDest++ = * strSrc++) != ‘’ );
    }

    7分  

    1
    2
    3
    4
    5
    6
    void strcpy(char *strDest, const char *strSrc) 
    {
     //对源地址和目的地址加非0断言,加3分
     assert( (strDest != NULL) && (strSrc != NULL) );
     while( (*strDest++ = * strSrc++) != ‘’ );
    }

    10分  
    //为了实现链式操作,将目的地址返回,加3分!  

    char * strcpy( char *strDest, const char *strSrc ) 
    {
     assert( (strDest != NULL) && (strSrc != NULL) );
     char *address = strDest; 
     while( (*strDest++ = * strSrc++) != ‘’ ); 
     return address;
    }
     

    字符串拷贝函数strcpy的原型:

    char *strcpy(char *strDest,const char *strSrc);

    strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:

        char str[20];

        int length = strlen( strcpy(str, “Hello World”) );

    作用:为了生成链式表达式。

    在面试中常会遇到写 strcpy,以及相关的问题,比如说返回值的作用等。

    ->strcpy,strcat,strcmp,strstr的函数实现如下所示:

    char * strcpy(char* dst,const char* src)
    {
        assert((dst!=NULL)&&(src!=NULL));
        char* cp=dst;
        while(*src!='')
        {
            *dst=*src;
            src++;
            dst++;
        }
        *dst='';
        return cp;
    }
    
    char* strcat ( char * dst , const char * src )
    {
        char * cp = dst;
        while( *cp )
            cp++;                       /* find end of dst */
        while(*src!='')
        {
            *cp++=*src++;
        }
        *cp='';
        return dst;                  /* return dst */
    }   
    
    int strcmp(const char* str1, const char* str2)
    {
        int ret = 0;
        while(!(ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1)
        {
            str1++;
            str2++
        }
        if (ret < 0)
        {
            return -1;
        }
        else if (ret > 0)
        {
            return 1;
        }
        return 0;
    }
    
    char *strstr( const char *s1, const char *s2 )
    {
        int len2;
        if ( !(len2 = strlen(s2)) )
            return (char *)s1;
        for ( ; *s1; ++s1 )
        {
            if ( *s1 == *s2 && strncmp( s1, s2, len2 )==0 )
                return (char *)s1;
        }
        return NULL; 
    } 
    

    strcat:将两个char类型连接

    char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);
    结果放在d中
    printf("%s",d);
    输出 d 为 GoldenGlobalView (中间无空格)
    d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
    返回指向d的指针

    strcmp:比较两个字符串str1和str2

    若str1=str2,则返回零;
    若str1<str2,则返回负数;
    若str1>str2,则返回正数。

    strstr:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。  

  • 相关阅读:
    Active Directory如何用C#进行增加、删除、修改、查询用户与组织单位!
    showModalDialog和showModelessDialog的使用
    如何在GridView中使用DataFromatString
    GridView/DataGrid单元格不换行的问题
    要Gmail、Orkut邀请的请留下你的邮箱
    How to reset security settings back to the defaults
    ASP.NET 2.0 学习笔记 1: session 与 script 应用
    关闭主窗体而不退出主程序 以及如何获取操作系统的关闭、注销信息
    ASP.NET 2.0 学习笔记 2: 页面间传值
    Windows 系统常用设置方法与技巧
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/5277036.html
Copyright © 2020-2023  润新知