• 字符串操作相关库函数的编写 转载


    一、字符串拷贝

    题目描述:
    要求实现库函数strcpy,
    原型声明:extern char *strcpy(char *dest,char *src);
    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
    返回指向dest的指针。

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

    //得2分     
    void strcpy( char *strDest, char *strSrc )     
    {     
        while( (*strDest++ = * strSrc++) != '/0' );     
    }      
    
    //得4分     
    void strcpy( char *strDest, const char *strSrc )      
    {     
        //将源字符串加const,表明其为输入参数,加2分     
        while( (*strDest++ = * strSrc++) != '/0' );     
    }      
    
    //得7分     
    void strcpy(char *strDest, const char *strSrc)      
    {     
        //对源地址和目的地址加非0断言,加3分     
        assert( (strDest != NULL) && (strSrc != NULL) );     
        while( (*strDest++ = * strSrc++) != '/0' );     
    }      
    
    //得9分     
    //为了实现链式操作,将目的地址返回,加2分!     
    char * strcpy( char *strDest, const char *strSrc )      
    {     
        assert( (strDest != NULL) && (strSrc != NULL) );     
        char *address = strDest;      
        while( (*strDest++ = * strSrc++) != '/0' );      
        return address;     
    }    
    
    //得10分,基本上所有的情况,都考虑到了  
    //如果有考虑到源目所指区域有重叠的情况,加1分!     
    char * strcpy( char *strDest, const char *strSrc )      
    {     
        if(strDest == strSrc) { return strDest; }  
        assert( (strDest != NULL) && (strSrc != NULL) );     
        char *address = strDest;      
        while( (*strDest++ = * strSrc++) != '/0' );      
        return address;     
    }

    二、小部分库函数的实现

    考察此类编写同库函数一样功能的函数经常见于大大小小的IT公司的面试题目中,以下是常见的字符串库函数的实现,希望,对你有所帮助,有任何问题,欢迎不吝指正:

    int strcmp(const char *s, const char *t)   
    {   
        assert(s != NULL && t != NULL);   
        while (*s && *t && *s == *t)   
        {   
            ++ s;   
            ++ t;   
        }   
        return (*s - *t);   
    }
    char *strcat(char *strDes, const char *strSrc)   
    {   
        assert((strDes != NULL) && (strSrc != NULL));   
        char *address = strDes;   
        while (*strDes != '/0')   
            ++ strDes;   
        while ((*strDes ++ = *strSrc ++) != '/0')   
            NULL;   
        return address;   
    }  

    int strlen(const char *str)   
    {   
        assert(str != NULL);   
        int len = 0;   
        while (*str ++ != '/0')   
            ++ len;   
        return len;   
    }   

    void *memcpy(void *dest, const void *src, unsigned int count)   
    {   
        assert((dest != NULL) && (src != NULL));   
        void *address = dest;   
        while (count --)   
        {   
            *(char *) dest = *(char *) src;   
            dest = (char *) dest + 1;   
            src = (char *) src + 1;   
        }   
        return address;   
    }   

    int strncmp(const char *s, const char *t, unsigned int count)   
    {   
        assert((s != NULL) && (t != NULL));   
        while (*s && *t && *s == *t && count --)   
        {   
            ++ s;   
            ++ t;   
        }   
        return (*s - *t);   
    }  

    char *strncat(char *strDes, const char *strSrc, unsigned int count)   
    {   
        assert((strDes != NULL) && (strSrc != NULL));   
        char *address = strDes;   
        while (*strDes != '/0')   
            ++ strDes;   
        while (count -- && *strSrc != '/0' )   
            *strDes ++ = *strSrc ++;   
        *strDes = '/0';   
        return address;   
    } 

    转载于:http://blog.csdn.net/v_JULY_v/article/details/6417600
  • 相关阅读:
    地址栏传值 JS取值方法
    定位导航 制作
    验证码
    图片水印
    AJAX 三级联动
    javascript 和Jquery 互转
    Jquery 事件 DOM操作
    Jquery 基础
    软件工程中的形式化方法读后感
    软件工程理论、方法与实践 需求工程读后感
  • 原文地址:https://www.cnblogs.com/aoguren/p/3305389.html
Copyright © 2020-2023  润新知