3

从可写字符数组中删除第 i 个字符(第一个索引是 0,第二个是 1 等等)。您认为这是执行此任务的合法方式吗:

void delete_char(char *str, int i) {
    strcpy(str + i,str + i + 1);
}

我们可以指望函数 strcpy 总是将字符从最左边复制到最右边吗?

4

3 回答 3

5

发布的代码具有未定义的行为,来自strcpy()

将 src 指向的字节串复制到 dest 指向的字节串。 如果字符串重叠,则行为未定义。还复制终止的空字节。

memmove()可以用来完成任务,记得复制空终止符。

于 2013-08-06T10:48:14.503 回答
3

您还可以编写自己的代码来避免未定义的行为:

void delete_char(char *str, int i) {
    int len = strlen(str);

    for (; i < len - 1 ; i++)
    {
       str[i] = str[i+1];
    }

    str[i] = '\0';
}
于 2013-08-06T10:51:57.193 回答
2

当字符串重叠时接受其他答案strcpy无法处理,其中memmove可以如下使用,

memmove(str+i, str+i+1, strlen(str) - i);

于 2013-08-06T10:58:02.837 回答