如何缩短作为指针指针的字符串

时间:2015-05-10 00:36:10

标签: c string

我有一个字符串:char** s。像这样:

void cad_rem(char **s, int p){

}

其中s是我需要删除<p>位置中的一个字符的字符串 如果p是字符串的最后一个字符 - 只是一个例子 - 而我只是做了一个:

更新

void cad_rem(char **s, int p){
    size_t len = strlen(s);

    if(!(p > len)){
        memmove(s + p, s + p + 1, len - p);
    }
}  

1 个答案:

答案 0 :(得分:1)

正如所指出的,char **是指向char *的指针,而不是字符串,所以你必须取消引用它。但是,您的功能也可以直接处理char *

这样的事情应该有效:

void cad_rem(char *s, size_t p)
{
    size_t len = strlen(s);
    if (p >= len) {
        /* put code here to error out and return */
    }

要移动剩余的字符,请使用memmove。来自the memmove man page

void *memmove(void *dest, const void *src, size_t n);
     

[...] memmove()函数将n字节从内存区域src复制到内存区域dest

这也可以轻松调整以删除多个角色。

    memmove(s + p, s + p + 1, len - p);
}

这会将字符串(包括终结符)的剩余字节从s + p + 1(即从要删除的字符后开始)移动到s + p(即从该字符开始的位置开始)。 / p>

len - plen - p - 1 + 1相同,p是位于strlen位置的字符后面的字符,再加上尾随字符串终结符的一个字符。)

如果您知道字符串的大小,则可以避免'\0'调用,在这种情况下,删除最后一个字符只需使用realloc覆盖它。

至于您对\0的建议用法,请记住C字符串通常以strlen字节终止。如果你正在处理普通的C字符串(并且基于你使用的\0,你肯定是),你需要确保字符串末尾仍然有一个realloc - 然后,document.open(); document.write("<h1>Welcome!</h1>"); document.write("Hello, " + thename + ", and welcome to my page!"); document.close(); 甚至没有必要。