通过memcpy移动缓冲区

时间:2011-06-24 13:40:25

标签: 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';
}

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';
}

第二版是否安全?

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

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

关于“安全” - 您错过了一个重要案例 - 检查您是否没有超出缓冲区。使用size参数绑定循环。

答案 2 :(得分:0)

    memcpy(str, start, end-start);

如果memmove(参见Paul R.'s answer)另外1个字符,则该额外字符为空终止符。