当我想在第一个字母处替换字符串时,为什么 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
^ ^
这些是 target
和 source
个位置。现在要移动多少字节?你说
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 有效。
在下面的代码中,我不明白,为什么当 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
^ ^
这些是 target
和 source
个位置。现在要移动多少字节?你说
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 有效。