my functions.h

扫码查看

1. 考虑重叠的 memcpy

void* MemoryCopy(void *dest, const void *src, size_t size)
{
    assert(dest != NULL);
    assert(src != NULL);
    if (src == dest)
        return dest;

    char *d;
    const char *s;

    if ((src > dest) || (src <= (char*)dest - size))
    {
        d = (char*)dest;
        s = (const char*)src;
        while (size--)
            *d++ = *s++;
    }
    else     /* overlap 重叠情况从高位到低位复制   */
    {
        d = (char*)dest + size - 1;
        s = (const char*)src + size - 1;
        while (size--)
            *d-- = *s--;
    }

    return dest;
}
View Code

2. 字符串分割(详细参见:https://www.cnblogs.com/htj10/p/11354618.html)

// delim分隔符,所有delim中包含的字符都是分隔符,保留空字符串"",前向分割
void split(const char* str, const char* delim, std::vector<std::string> &vRet)
{
    const char* p = str;
    const char* q = NULL;
    while (*p && (q = strpbrk(p, delim)))
    {
        vRet.push_back(std::string(p, q));
        ++q;
        p = q;
    }
    if (*p)
        vRet.push_back(std::string(p));
}
// str是待分割的字符串 delim整体作为一个分隔符,保留空字符串"",前向分割
void split(const char* str, const char* delim, std::vector<std::string> &vRet)
{
    const int n = strlen(delim);
    const char* p = str;
    const char* q = NULL;
    while (*p && (q = strstr(p, delim)))
    {
        vRet.push_back(std::string(p, q));
        q = q + n;
        p = q;
    }
    if (*p)
        vRet.push_back(std::string(p));
}
View Code
12-24 15:37
查看更多