c语言面试

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容