我发现这个函数,删除所有其他字符串的字符串的发生,但我不明白它是如何工作的,因为它没有修改变量ch,但它改变了变量p代替。 下面是函数:删除一个字符串的另一个字符串的发生
void enlever1(char* ch,char* sch)
{
char* p;
do
{
p=strstr(ch,sch);
if(p) strcpy(p,p+strlen(sch));
}
while(p);
}
我发现这个函数,删除所有其他字符串的字符串的发生,但我不明白它是如何工作的,因为它没有修改变量ch,但它改变了变量p代替。 下面是函数:删除一个字符串的另一个字符串的发生
void enlever1(char* ch,char* sch)
{
char* p;
do
{
p=strstr(ch,sch);
if(p) strcpy(p,p+strlen(sch));
}
while(p);
}
首先,字符串作为数组存储在内存中,多个指针可能指向单个字符串。
成功时,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!
非常感谢你 如果我理解的很好,对指向单个字符串的指针的任何修改都会修改该字符串 –
strstr
不会删除发生,但地处ch
sch
。您的变量p
指向在ch
中找到sch
中包含的字符串的位置。如果找不到这样的字符串,则返回NULL
,该值被分配给p
。
不应该使用strcpy,你应该知道你的缓冲区大小和使用strncpy –
这个函数实际上起作用,问题是:我不知道它是干什么的,因为ch在函数中没有改变。 –