给定一个长度为 n 的 char 数组缓冲区,从位置 pos 删除 m 个字符

Given a char array buffer of length n delete m characters from position pos

我想从无符号字符缓冲区中删除字符

C语言:

unsigned char buff[n] = "...."; // len n byte array

我想到了使用 memmove

memmove(buff + pos, buff + pos + m, ???);

任何人都可以帮助解决???的价值?是的,我得到了删除 m 个字符的正确结果,而不管 ???值(n - pos 到 n 之间的任何值)

m和pos的值都小于n且buff是字节数组(一个数据包)

嗯,这段代码根本没有优化,但展示了我认为最容易理解的方法:


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void delete(int p, const char * str){
    char *done;
    int t = strlen(str); 
    if(p>t||p<=0){
        return; 
    }else{
        strcpy(done, str);
        strcpy(done+p-1,str+p); 
    }
    strcpy(str, done);
}
int main(int argc, char **argv){
    char buff[] = "abcdefghi"; 
    delete(3, buff); 
    printf(buff);//it prints abcdefghi
    return 0;
}

想法很简单 strcpy 有两个参数,第一个是指向目标字符串的指针 (str),第二个是指向原点的指针。

我们首先将整个原始字符串 (str) 复制到我们的临时字符串 (done)

然后我们只需将 str+p(p 是字符串上从 1 开始到 strlen 结束的位置,因为 strlen 不包括我们检查到最后位置的终止符字节)复制到 done+p-1 为我们想要 erase/overlap 位置 p

的字符

最后我们直接把done复制到原来的字符串(str)就成功擦掉了一个字符


此外,由于我们使用的是 strcpy,该函数会处理终止符字节,我们也不必太注意释放临时指针,尽管编译器会抱怨原始字符串的转换是解决起来相当简单,但为了容易弄清楚我一直没有回答的逻辑