使用memmove将字符串的后面的部分向前拷贝,即使整体长度超过原字符串的长度,也不会出现未定义行为。
比如将字符串char* left = abc/def/ghi,从索引为4的位置开始拷贝,拷贝到left中,拷贝长度为9(即使更长),能够正常完成。
本来考虑会出问题的点是:拷贝源也是在本来的字符串left上,加上拷贝的长度,可能会访问到超出left长度(12)的部分。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{
char *p = NULL;
size_t left_len = 0;
char* bb = "abc/def/ghi";
char* left = malloc(12);
strncpy(left, bb, 11);
left_len = strlen(left);
p = strchr(left, '/');
printf("p: %s\n", p);
printf("left: %s\n", left);
printf("left_len: %lu\n", left_len);
printf("p - left: %lu\n", (p - left));
left_len -= p - left;
printf("left_len: %lu\n", left_len);
memmove(left, p + 1, left_len + 1);
printf("left: %s\n", left);
return 0;
}
输出:
p: /def/ghi
left: abc/def/ghi
left_len: 11
p - left: 3
left_len: 8
left: def/ghi