在下面的代码中,我不明白,为什么我必须在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
注意:代码可以满足我的需求。我只想明白为什么:)
答案 0 :(得分:2)
您正在指定目标和来源,然后说明要移动的字节数。
holidayhousedayhouse0
^ ^
这些是target
和source
职位。现在要移动多少字节?你说
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有效。