面试-重写基础功能函数

重写基础函数

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字符串

原文地址:https://www.cnblogs.com/wanghaiyang1930/p/9612981.html