当我想在第一个字母处替换字符串时,为什么memmove表现不同?

时间:2018-02-27 18:50:40

标签: c string memmove

在下面的代码中,我不明白,为什么我必须在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

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

1 个答案:

答案 0 :(得分:2)

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

holidayhousedayhouse0
^   ^

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

strlen(string1) - strlen(string2+1)

相同
20 - 3 = 17

精确移动了那么多字节。 (\0也被复制了。)

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

string2+1 - string2指向数组的开头 - 这是数组中的第一个字符(h)。当您添加1时 - 它基本上按其指向的大小移动 - char的大小为1,因此它会移动1位置。这就是为什么你得到3的长度,就像你计算第二个字母o中的字母一样。 (最多\0)。

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

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

相关问题