c - 在 C 中使用 memmove 从字符串中删除子字符串

标签 c string memmove

我正在尝试使用 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/

相关文章:

c - 用C实现闭包

C - 使用 exec() 而不是 system()

c - 从动态链表中删除节点

c - 将单个值分配给多个变量

c# - MarshalAsAttribute 字符串数组

memcpy 或 memmove 可以返回与 dest 不同的指针吗?

C内存重叠?

php - 用于变量连接的单引号或双引号?

string - 检查元素是否存在于 Racket 列表中

c++ - memcpy 或 memmove 会导致复制类出现问题吗?