2013-12-19 53 views
-1

我发现这个函数,删除所有其他字符串的字符串的发生,但我不明白它是如何工作的,因为它没有修改变量ch,但它改变了变量p代替。 下面是函数:删除一个字符串的另一个字符串的发生

void enlever1(char* ch,char* sch) 
{ 
    char* p; 
    do 
    { 
     p=strstr(ch,sch); 
     if(p) strcpy(p,p+strlen(sch)); 
    } 
    while(p); 
} 
+0

不应该使用strcpy,你应该知道你的缓冲区大小和使用strncpy –

+0

这个函数实际上起作用,问题是:我不知道它是干什么的,因为ch在函数中没有改变。 –

回答

1

首先,字符串作为数组存储在内存中,多个指针可能指向单个字符串。

成功时,strstr返回指向ch指向的字符串中第一个出现sch的指针。现在,p指针指向原始字符串的一部分 - 当您使用p指针更改字符串时,您将更改原始字符串。

下面是简单的例子:假设您有存储在存储器中像这样的字符串:

Hello World!\0 
^   ^
|   | 
ch   end of string character 

现在,让我们说,你执行p = strstr(ch, "Wo")。该p指针将指向原始字符串的一部分:

Hello World!\0 
^ ^ ^
|  |  | 
ch p  end of string character 

现在,如果你改变p,你也会改变ch

p[0] = 'T'; /* change the first character to T */ 

这将导致:

Hello Torld!\0 
^ ^ ^
|  |  | 
ch p  end of string character 

printf(ch)将会打印:

Hello Torld! 
+0

非常感谢你 如果我理解的很好,对指向单个字符串的指针的任何修改都会修改该字符串 –

0

strstr不会删除发生,但地处chsch。您的变量p指向在ch中找到sch中包含的字符串的位置。如果找不到这样的字符串,则返回NULL,该值被分配给p

相关问题