我正在尝试使用 memmove 实现一个从字符串中删除子字符串的函数。 打印结果时,似乎我没有正确移动子字符串,即使我似乎在源字符串中使用了正确的位置。 我的功能是:
char * removeSubStr(char * str, const char * substr){
char *scan_p, *temp_p;
int subStrSize = strlen(substr);
if (str == NULL){
return 0;
}
else if (substr == NULL){
return str;
}
else if (strlen(substr)> strlen(str)){
return str;
}
temp_p = str;
while(scan_p = strstr(temp_p,substr)){
temp_p = scan_p + subStrSize;
memmove(scan_p, temp_p, sizeof(temp_p)+1);
}
return str;
}
例如,我的输出是: 如果发送字符串“请删除 rem 删除 rem999”, 我回来了:“请超过 rm ovmove re 999”
谢谢!
最佳答案
以下内容:
while(scan_p = strstr(temp_p,substr)){
temp_p = scan_p + subStrSize;
memmove(scan_p, temp_p, sizeof(temp_p)+1);
}
意义不大。
你需要这样的东西:
while( temp_p = strstr( temp_p, substr ) )
{
length = strlen( temp_p );
memmove( temp_p, temp_p + subStrSize, length - subStrSize + 1 );
}
注意:在我回答的第一个版本中,我只是使用 strlen()
,但正如评论者指出的那样,由于标准的原因,这是不可取的。 (它仍然很可能会起作用,因为我们是向下复制,而不是向上复制,但最好不要通过违反标准来试探命运。)因此,这就是我们需要 memmove()
的原因。
请注意,通过多行代码可以对此进行优化,这样您就不必在循环的每次迭代中计算 length = strlen( temp_p );
。此优化留给学生作为练习。
另请注意:
你最好
int subStrSize = strlen(substr);
在你检查substr == NULL
;没有
这样的东西styrlen()
sizeof(temp_p)
做的事情与您认为的完全不同。
关于c - 在 C 中使用 memmove 从字符串中删除子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45568460/