当我想在第一个字母处替换字符串时,为什么 memmove 的行为会有所不同?

Why does memmove behave different when i want to replace a string at the first letter?

在下面的代码中,我不明白,为什么当 pos == 0 时我必须在 if 语句中这样写 memmove (当我想在字符串数组的第一个位置进行替换时):

strlen(string1) - strlen(string2+1))

我想我不明白我必须为我的 memmove 函数选择多少字节。

if 和 else 语句有什么不同?

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

void cleanup(char *string1, char *string2, int pos);
int indexe(char string1[], char string2[]);

int main() {
    char string1[100];
    char string2[100];

    printf("PUT YOUR STRING\n");
    scanf("%99s", string1);

    printf("WHICH LETTERS DELETE?\n");
    scanf("%99s", string2);

    printf("String1 vorher: %s\n", string1);


    while(strstr(string1, string2)){
            cleanup(string1, string2,indexe(string1, string2));
    }

    printf("String1 before: %s\n", string1);
    printf("String1 after: %d\n", strlen(string1));

    return 0;
}

void cleanup(char *string1, char *string2, int pos) {

    pos = pos - strlen(string2);


    if(pos == 0){
    memmove(&string1[pos], &string1[pos + strlen(string2)], strlen(string1) - strlen(string2+1));
    }
    else
    memmove(&string1[pos], &string1[pos + strlen(string2)], strlen(string1) - strlen(string2));

}


int indexe(char string1[], char string2[]){

    char *firstpos = string1;
    char *secondpos = strstr(string1, string2);



    int pos = secondpos - firstpos + strlen(string2);

    printf("deleted index: %d\n", pos);

    return pos;

}

输出:dayhousedayhouse

注意:代码可以满足我的要求。我只想明白为什么:)

您正在指定目标和源,然后说明要移动多少字节。

holidayhousedayhouse0
^   ^

这些是 targetsource 个位置。现在要移动多少字节?你说

strlen(string1) - strlen(string2+1)

相同
20 - 3 = 17

那么多字节被精确地移动了。 ([=16=] 也被复制了)。

holidayhousedayhouse0
^   ^
dayhousedayhouse0
^   
|---------------|
     17 chars

string2+1 - string2 指向数组的开头 - 这是数组 (h) 中的第一个字符。当您添加 1 - 它基本上按它指向的大小移动 - char 的大小是 1 所以它移动 1 位置。这就是为什么你得到 3 的长度,就好像你从第二个字母 o 开始计算字母一样。 (最多 [=16=])。


上面提供的解释暗示 cleanup 逻辑可以简单地使用 if 部分的 memcpy 语句来完成。 else部分可以省略。

鉴于简单的任务,您显示的代码过于复杂。移除逻辑可以是统一的。 This 有效。