• 面试-重写基础功能函数


    重写基础函数

    1. 字符串拷strcpy()

      函数strcpy的原型是char* strcpy(char* des , const char* src)des src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。

     

    char* strcpy( char* dst, const char* src ) {
        assert( NULL != dst && NULL != src );
    
        char* rtn = dst;
        while ( (*dst++ = *src++) != '' ) {}
    
        return rtn; 
    }

     

      1) 最后拷贝了结束符’’;

      2源指针应该声明为 const 类型

      3要判断源指针和目的指针为空的情况

      4函数返回 char* 的目的是为了支持链式表达式,即strcpy可以作为其他函数的实参。

    2. 字符串长度strlen()

      函数strlen的原型是size_t strlen(const char *s)

     

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

     

      1sizeof是运算符,strlen是库函数

      2数组做sizeof的参数不退化,传递给strlen就退化为指针了。

    3. 字符串连接strcat()

      函数strcat的原型是char* strcat(char* des, char* src)des src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。

     

    char* strcat( char* dst, const char* src) {
        assert( NULL != dst && NULL NULL != src );
    
        char* rtn = dst;
        while ( *dst != '' ) {
            ++dst;
        }
    
        while ( (*dst++ = *src++) != '' ) {}
    
        return rtn;
    }

     

     

    4. 字符串比较strcmp()

      函数strcmp的原型是int strcmp(const char *s1,const char *s2)

        1s1==s2,返回零;

        2s1>s2,返回正数;

        3s1<s2,返回负数。

      即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’’为止。

     

    char * strcmp( const char* str1, const char* str2 ) {
        assert( NULL != str1 && NULL != str2 );
    
        while ( *str1 == *str2 ) {
            if ( *str1 == '' )
                break;
    
            ++str1;
            ++str2;
        }
    
        return *str1 - *str2;
    }

     

     

    5. memcpy()

    void* memcpy( void* dst, const void* src, size_t count ) {
        assert( NULL != dst && NULL != src );
    
        void* rtn = dst;
        while ( count-- ) {
            *(char*)dst = *(const char*)src;
            dst = (char*)dst + 1;
            src = (const char*)src + 1;
        }
    
        return rtn;
    }

    6. memmove()

    void* memmove( void* dst, const void* src, size_t count ) {
        assert( NULL != dst && NULL != src );
        
        void* rtn = dst;
        if ( dst <= src || (char*)dst >= ((const char*)src + count) ) {
            while ( count-- ) {
                *(char*)dst = *(const char*)src;
                dst = (char*)dst + 1;
                src = (const char*)src + 1;
            }
        } else {
            dst = (char*)dst + count - 1;
            src = (char*)src + count - 1;
    
            while ( count-- ) {
                *(char*)dst = *(const char*)src;
                dst = (char*)dst - 1;
                src = (char*)src - 1;
            }
        }
    
        return rtn;
    }

    7. atoi()

    int atoi( const char* str ) {
        assert( NULL != str );
    
        while ( *str == ' ' || *str == '	' || *str == '
    ' ) {
            ++str;
        }
    
        bool negative = false;
        if ( *str == '-' ) {
            ++str;
            negative = true;
        } else if ( *str == '+' ) {
            ++str 
        }
    
        int rtn = 0;
        while ( *str >= '0' && *str <= '9' ) {
            rtn = rtn*10 + *str - '0';
            ++str;
        }
    
        if ( negative )
            return -rtn;
    
        return rtn;
    }

    8. itoa()

    char* itoa( int value, char* buf, int radix ) {
        assert( NULL != buf );
    
        char* rtn = buf;
        if ( value < 0 ) {
            *buf++ = '-';
            value = -value;
        }
    
        char* ptr = buf;
        while ( value > 0 ) {
            int v = value % 10;
            v /= 10;
            *ptr++ = (char)value + '0'
        }
    
        *ptr-- = '';
        while ( buf < ptr ) {
            char temp = *ptr;
            *ptr = *buf;
            *buf = temp;
            ++buf;
            --buf;
        }
    
        return rtn;
    }

    9. 其他

      在linux下没有itoa这个函数linux下的字符转换函数只有:
        atof 字符串转换到浮点型数
         atoi 字符串转换到整型数: int atoi(const char *nptr);跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。
         atol 字符串转换到长整型数
         ecvt 浮点型数转换到字符串,取四舍五入
         fcvt 浮点型数转换到字符串,取四舍五入
         gcvt 浮点型数转换到字符串,取四舍五入
         strtod 字符串转换到浮点型数
         strtol 字符串转换到长整型数
         strtoul 字符串转换到无符号长整型数
         toascii 将整形数转换合法的ASCII字符串

  • 相关阅读:
    codeblocks-17.12mingw-nosetup(mingw编译,绿色免安装版)的下载、安装及设置一
    我的Qt历程1:第一个Qt程序
    单一职责-依赖倒转-代理模式-迭代器模式等
    结合你以往的工作经验谈谈高并发应用的性能优化措施
    如何优化数据库,如何提高数据库的性能?
    在一个千万级的数据库查询中,如何提高查询效率?
    如何提高页面的显示速度?假如一个页面的加载时间是10.89s,你会用什么方式进行优化?
    强制提高网站性能有什么办法
    简述httpModule与HttpHandler
    EntityFramework的效率与ADO.Net的效率哪个高?
  • 原文地址:https://www.cnblogs.com/wanghaiyang1930/p/9612981.html
Copyright © 2020-2023  润新知