我有一个函数drop_left(),它从字符串中删除前n个字符。我将指针增加n个空格,使字符串指向前n个字符后的所有内容。当我返回main时,该函数实际上并没有改变字符串。我做错了什么?
int main(int argc, char** argv) {
char string[]="drop left";
drop_left(string, 2);
printf("Drop left: %s\n" , string);
}
void drop_left(char *s, int n){
s+=n;
}
答案 0 :(得分:3)
因为您正在修改函数内部的s
,这对指向函数字符串OUTSIDE的指针没有任何影响。您需要return s
在函数内部,然后string = drop_left(string, 2)
。
请注意,这样做会导致内存泄漏。你的代码只是导致C忘记"关于丢弃的角色,但是如果你对你的malloc()空间的字符串做同样的事情,他们仍然会耗尽内存并造成麻烦。
答案 1 :(得分:1)
当您在s
中更改drop_left
时,您正在更改本地变量。它不会改变原始字符串在调用函数中指向的位置。
处理它的一种方法是更改字符串的内容,以便查看调用函数的更改。你可以使用类似的东西:
void drop_left(char *s, int n)
{
char* s2 = s + n;
while ( *s2 )
{
*s = *s2;
++s;
++s2;
}
*s = '\0';
}