通过memcpy移动缓冲区

Mih*_*yan 3 c

我编写了以下2个ltrim函数(从字符串左侧删除空格的函数):

1.(把这段代码放在这里不能得到这样的代码作为答案)

void ltrim(char * str, int size)
{
    char const *start = str;
    char const *end = start + size;
    for(;*start && (*start==' ' || *start=='\n' || *start=='\r' || *start=='\t');++start);

    while(start != end)
    {
        *str = *start;
        ++start;
        ++str;
    }
    *str='\0';
}
Run Code Online (Sandbox Code Playgroud)

2.

void ltrim(char * str, int size)
{
    char const *start = str;
    char const *end = start + size;
    for(;*start && (*start==' ' || *start=='\n' || *start=='\r' || *start=='\t');++start);
    memcpy(str, start, end-start);
    *(str + (end - start)) = '\0';
}
Run Code Online (Sandbox Code Playgroud)

第二版安全吗?

PS我已经尝试过它可以工作,但不确定memcpy在这种情况下是否安全.

Pau*_*l R 12

当源和目标重叠时,您应该使用memmove而不是memcpy.

从memcpy手册页:

The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove(3) if the memory areas do overlap.