我有一个字符串: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);
}
}
答案 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 - p
与len - 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();
甚至没有必要。