美文网首页
c语言面试

c语言面试

作者: ahubaoan | 来源:发表于2018-07-17 17:21 被阅读0次

    1.strcmp

    #include <stdio.h>
    
    int strcmp(const char *s1, const char *s2)
    {
        char a1, a2;
        
        //assert(s1)
        //assert(s2)
        while (1) {
            a1 = *s1++;
            a2 = *s2++;
            if (a1 != a2) {
                return a1 - a2;
            }
            if (a1 == 0)
                break;
        }
        return 0;
    }
    
    int main(int argc, char *argv[])
    {
        printf("strcmp=%d\n", strcmp(argv[1], argv[2]));
    }
    

    2.memcpy

    void *memcpy(void *dst, const void *src, size_t len)
    {
        printf("len=%ld\n", len);
        const char* s = (const char *)src;
        char* d = (char *)dst;
    
        if (src == NULL || dst == NULL) {
            return NULL;
        }
    
        //顺序拷贝
        if (d <= s) {
                printf("len=%ld\n", len);
            while (len != 0) {
                *d++ = *s++;
                len--;
            }
        } else { //倒序拷贝
            while (len != 0) {
                len--;
                *(d + len) = *(s + len);
            }
        }
        return (void *)dst;
    }
    

    注意点:
    1.void*空指针不能直接操作加减,需要先转成char *然后再操作
    2.要考虑内存重叠问题,这里是分为顺序拷贝和倒序拷贝
    3.注意size_t是unsigned int类型,减到0再减的话,会变成大整数而不是负数,如果使用while(--len <= 0)这里可能会出现core dump

    相关文章

      网友评论

          本文标题:c语言面试

          本文链接:https://www.haomeiwen.com/subject/vojgpftx.html