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

C 当我想替换第一个字母处的字符串时,为什么memmove的行为会有所不同?,c,string,memmove,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 i

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

}
#包括
#包括
空洞清理(字符*string1,字符*string2,int pos);
int-indexe(char-string1[],char-string2[]);
int main(){
charstring1[100];
字符串2[100];
printf(“放入字符串\n”);
scanf(“%99s”,string1);
printf(“删除哪些字母?\n”);
scanf(“%99s”,string2);
printf(“String1 vorher:%s\n”,String1);
而(strstr(string1、string2)){
清理(string1、string2、indexe(string1、string2));
}
printf(“String1在:%s\n之前”,String1);
printf(“String1在:%d\n之后”,strlen(String1));
返回0;
}
空洞清理(字符*string1、字符*string2、整数位置){
pos=pos-strlen(string2);
如果(位置==0){
memmove(&string1[pos]、&string1[pos+strlen(string2)]、strlen(string1)-strlen(string2+1));
}
其他的
memmove(&string1[pos]、&string1[pos+strlen(string2)]、strlen(string1)-strlen(string2));
}
int索引(字符字符串1[],字符字符串2[]{
char*firstpos=string1;
char*secondpos=strstrstr(string1,string2);
int pos=第二个pos-第一个pos+strlen(string2);
printf(“已删除索引:%d\n”,pos);
返回pos;
}
输出:Dayhouse Dayhouse


注意:代码符合我的要求。我只想了解原因:)

您指定了目标和源,然后说要移动多少字节

holidayhousedayhouse0
^   ^
这些是
目标
位置。现在要移动多少字节?你说

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

20 - 3 = 17
那么多字节被精确地移动。(也复制了
\0


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


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


您所展示的代码在给定简单任务的情况下过于复杂。删除逻辑可以是统一的。有效。

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

holidayhousedayhouse0
^   ^
这些是
目标
位置。现在要移动多少字节?你说

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

20 - 3 = 17
那么多字节被精确地移动。(也复制了
\0


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


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


您所展示的代码在给定简单任务的情况下过于复杂。删除逻辑可以是统一的。有效。

strlen(string2+1)
或多或少等同于
strlen(string2)-1
。有帮助吗?如果
string2
是空字符串,则没有帮助。这是一种危险的做法。@rodrigo我知道,但当我想替换字符串的第一个字符时,为什么我必须表现得不同呢。为什么当pos==0时我必须写strlen(string2+1),而当pos=0时我必须写strlen(string2)0?@Sedem.:您想从第一个字符串中删除第二个字符串,是吗?
strlen(string2+1)
或多或少等同于
strlen(string2)-1
。有帮助吗?如果
string2
是空字符串,则没有帮助。这是一种危险的做法。@rodrigo我知道,但当我想替换字符串的第一个字符时,为什么我必须表现得不同呢。为什么当pos==0时我必须写strlen(string2+1),而当pos=0时我必须写strlen(string2)0?@Sedem.:你想从第一个字符串中删除第二个字符串的每一次出现,不是吗?当我有数组HolidayHouse并且我想替换单词“seda”时,我使用另一个if-case和strlen(string1)-strlen(string2),然后我必须计算20-4=16(不是20-3=17),但我的字符串在末尾有17个字符,就像你的例子一样。因为单词“seda”有4个字母,像“holi”是的。但为什么我在做这两件事时会有所不同[1]从string1中的某个地方删除stringpart[2]从string1中的开始删除stringpart。我不明白,因为在这两种情况下,我只删除了4个字母,所以我的字符串末尾有16个字母。但我为什么要做[1]20-4和[2]20-3@Sedem.:检查代码。这里不需要else。我想缩短我的代码。我编辑代码,以便您可以看到整个正确的代码code@Sedem.:你检查过我显示的代码了吗?我还提到这里可以省略
else
。当我有HolidayHouse数组,我想替换单词“seda”,然后我使用另一个if大小写strlen(string1)-strlen(string2),然后我必须计算20-4=16(不是20-3=17),但我的字符串末尾有17个字符,就像你的前一个例子一样