我编写了以下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在这种情况下是否安全。
答案 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个字符,则该额外字符为空终止符。