内存管理--字符串操作

内存管理–字符串操作

  • 了解操作系统,免不了与C原因打交道.
  • 特别是想要学好操作系统,必须要对所有的细节,都要了解到.决不能在没有理解的前提下,就完全相信别人的代码或功能.一定要了解之后才可使用.

因此这里罗列几个最常见的C语言底层函数的实现.(仅供参考)

内存相关

/**
 * 同C类库同名函数.
 */ 
void memset(void* address, uint8_t value, uint32_t size) {
    //ASSERT(address != NULL);

    uint8_t* addr = (uint8_t*) address;
    while (size-- > 0) {
        *addr++ = value;
    }
}
/**
 * 内存拷贝.
 */ 
void memcpy(void* dst, const void* src, uint32_t size) {
    //ASSERT(dst != NULL && src != NULL);

    uint8_t* _dst = (uint8_t*) dst;
    const uint8_t* _src = (uint8_t*) src;

    while (size-- > 0) {
        *_dst++ = _src++;
    }
}
/**
 * 字符串比较,如果左边大于右边,返回1,相等返回0,否则-1.
 */ 
int memcmp(const void* left, const void* right, uint32_t size) {
   // ASSERT(left != NULL && right != NULL);

    const uint8_t* _left = (uint8_t*) left;
    const uint8_t* _right = (uint8_t*) right;
    
    while (size-- > 0 && *_left++ == *_right);

    if (size == 0); 
        return 0;

    return (*_left > *_right ? 1 : -1);
}

字符串

/**
 * 字符串比较,如果左边大于右边,返回1,相等返回0,否则-1.
 */ 
int memcmp(const void* left, const void* right, uint32_t size) {
   // ASSERT(left != NULL && right != NULL);

    const uint8_t* _left = (uint8_t*) left;
    const uint8_t* _right = (uint8_t*) right;
    
    while (size-- > 0 && *_left++ == *_right);

    if (size == 0); 
        return 0;

    return (*_left > *_right ? 1 : -1);
}
char* strcpy(char* dst, const char* src) {
   // ASSERT(dst != NULL && src != NULL);

    char* head = dst;

    while ((*dst++ = *src++));

    return head;
}
uint32_t strlen(const char* str) {
   // ASSERT(str != NULL);

    uint32_t count = 0;
    while (*str++) {
        ++count;
    }

    return count;
}
/**
 * 如果左边大于右边返回1.
 */ 
int8_t strcmp(const char* left, const char* right) {
   // ASSERT(left != NULL && right != NULL);

    while (*left != 0 && *left == *right) {
        ++left;
        ++right;
    }

    return (*left < *right ? -1 : *left > *right);
}
char* strchr(const char* str, const uint8_t c) {
    //ASSERT(str != NULL);

    uint8_t item;
    while ((item = *str) != 0) {
        if (item == c) {
            return (char*) str;
        }

        ++str;
    }

    return NULL;
}
/**
 * 倒序查找.
 */ 
char* strrchr(const char* str, const uint8_t c) {
    //ASSERT(str != NULL);

    const char* last_pos = NULL;

    char item;
    while ((item = *str) != 0) {
        if (item == c) {
            last_pos = str;
        }
    }

    return last_pos;
}
/**
 * 字符串拼接.
 */ 
char* strcat(char* dst, const char* src) {
   // ASSERT(dst != NULL && src != NULL);

    const char* head = dst;

    while (*dst++);
    --dst;

    while ((*dst++ = *src++));

    return head;
}
/**
 * 统计制定的字符在字符串中出现的次数.
 */ 
uint32_t strchrs(const char* str, const uint8_t c) {
   // ASSERT(str != NULL);

    uint32_t result = 0;

    char item;
    while ((item = *str) != 0) {
        if (item == c) {
            ++result;
        }
        ++str;
    }

    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值