1

我正在尝试实现一个函数,用于使用 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;
}

例如,我的输出是:如果发送字符串“please remove rem remove rem999”,我会返回:“please ove rm ovmove re 999”

谢谢!

4

3 回答 3

4

以下:

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)做的事情与你认为的完全不同。

于 2017-08-08T12:39:36.463 回答
1

在这个循环中

temp_p = str;
while(scan_p = strstr(temp_p,substr)){
    temp_p = scan_p + subStrSize;
    memmove(scan_p, temp_p, `sizeof(temp_p)`+1);

}

有两个错误。

第一个是在循环的每次迭代之后,指针temp_p应该等于指针的值,scan_p因为字符串的尾部移动到这个位置。

第二个是这个表达式

sizeof(temp_p)

产生该类型对象的大小,char *而不是提供指针指向的字符串的长度temp_p

您的函数也经常调用该函数strlen

至于整体的功能设计,那么功能不应该检查参数之一是否等于NULL。这是函数客户端的任务。标准 C 字符串函数不做这样的检查。

函数实现可以如下所示,如演示程序中所示。

#include <stdio.h>
#include <string.h>

char * removeSubStr( char *str, const char *substr )
{
    size_t m1 = strlen(str);
    size_t m2 = strlen(substr);

    if (!(m1 < m2))
    {
        for (char *p = str; (p = strstr(p, substr)) != NULL; )
        {
            size_t n = m1 - ( p + m2 - str );
            memmove(p, p + m2, n + 1);
        }
    }

    return str;
}

int main( void )
{
    char s[] = "12A12B12C12D";

    puts(s);

    puts(removeSubStr(s, "12"));

    return 0;
}

程序输出为

12A12B12C12D
ABCD
于 2017-08-08T13:42:33.107 回答
-1

sizeof(temp_p)是 的大小char *,通常为 4

你可能想写strlen(temp_p)

于 2017-08-08T12:39:34.887 回答