在其他字符数组中替换字符数组
Replace char array in other char array
我有一个字符数组,我想用 1*
或 2*
替换 myDirectory1
或 myDirectory2
例如:C:/1*/file.txt
-> C:/MDirectory1/file.txt
例如:C:/2*/file.txt
-> C:/MDirectory2/file.txt
我的代码似乎可以工作,但我不明白某些事情:
像这样初始化动态字符数组可以吗?
char *cad = (char*)malloc(sizeof(char) * 15);
if (!cad) exit(1);
当我想将 char 数组插入另一个数组时,可以使用 realloc 吗?
realloc(*cad, sizeRep + strlen(auxi) + 1);
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *replaceString(char **cad) {
int sizeRep;
char *auxi = *cad, *plec;
char replace[500];
plec = strchr(*cad, '*');
switch (*(plec - 1)) {
case '1':
strcpy(replace, "myDirectory1");
break;
case '2':
strcpy(replace, "MyDirectory2");
}
sizeRep = strlen(replace);
realloc(*cad, sizeRep + strlen(auxi) + 1);
memmove(plec + strlen(replace) - 1, plec + 1, strlen(plec));
memmove(plec - 1, replace, sizeRep);
return auxi;
}
int main() {
char *cad = (char*)malloc(sizeof(char) * 15);
if (!cad) exit(1);
strcpy(cad, "C:/2*/file.txt");
printf("%s", replaceString(&cad));
return 0;
}
在您的示例中,我看不到任何重大问题。不过我喜欢加评论。
- 调用“
realloc
”函数后,如果没有足够的内存可供分配,*cad
的值可能无效。因此,正如 BLUEPIXY 在他的评论中所建议的那样,请注意这一点。
*cad
指针在不同位置使用不同。在 main
它是一个指针。但是在 replaceString
它是一个双指针。实用上没有问题,因为范围不同。但最好避免这种用法。
您的代码有多个错误:
- 您不检查是否找到
*
以及是否在大于 0
的偏移量处找到它。
- 您没有复制空终止符。
- 你的计算差了一个。
- 您没有存储
realloc()
的 return 值
- 您访问了字符串中已重新分配的位置,如果移动了字符串,这可能会出现未定义的行为。请改用偏移量。
2*
的替换与 1*
的替换不同。
这是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *replaceString(char **cad) {
char *auxi = *cad;
size_t len = strlen(auxi);
char *plec = strchr(auxi, '*');
if (plec && plec > auxi) {
size_t offset = plec - auxi - 1;
size_t sizeRep;
const char *replace = NULL;
switch (auxi[offset]) {
case '1':
replace = "myDirectory1";
break;
case '2':
replace = "myDirectory2";
break;
default:
return auxi;
}
sizeRep = strlen(replace);
// reallocate auxi: -2 for the characters removed, +1 for the null termnator
auxi = realloc(auxi, len - 2 + sizeRep + 1);
if (auxi == NULL)
return NULL;
memmove(auxi + offset + sizeRep, auxi + offset + 2, len - offset - 2 + 1);
memmove(auxi + offset, replace, sizeRep);
*cad = auxi;
}
return auxi;
}
int main(void) {
char *cad = strdup("C:/2*/file.txt");
if (!cad)
exit(1);
printf("%s\n", replaceString(&cad));
free(str);
return 0;
}
realloc()
是臭名昭著的问题来源,会导致未定义的行为和内存泄漏。您可能希望更改您的函数以使用更简单的 API,始终分配 return 值,而不会对参数产生副作用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *replaceString(const char *src) {
size_t size = strlen(src) + 1;
size_t offset = 0, matchlen = 0, replace_len = 0;
const char *replacement = "";
const char *p;
char *dest;
if ((p = strstr(src, "1*")) != NULL) {
offset = p - src;
match_len = 2;
replacement = "myDirectory1";
replacement_len = strlen(replacement);
} else
if ((p = strstr(src, "2*")) != NULL) {
offset = p - src;
match_len = 2;
replacement = "myDirectory2";
replacement_len = strlen(replacement);
}
dest = malloc(size - match_len + replacement_len);
if (dest) {
memcpy(dest, src, offset);
memcpy(dest + offset, replacement, replacement_len);
memcpy(dest + offset + replacement_len,
src + offset + match_len, size - offset - match_len);
}
return dest;
}
int main(void) {
char *str = replaceString("C:/2*/file.txt");
if (!str)
exit(1);
printf("%s\n", str);
free(str);
return 0;
}
我有一个字符数组,我想用 1*
或 2*
替换 myDirectory1
或 myDirectory2
例如:C:/1*/file.txt
-> C:/MDirectory1/file.txt
例如:C:/2*/file.txt
-> C:/MDirectory2/file.txt
我的代码似乎可以工作,但我不明白某些事情:
像这样初始化动态字符数组可以吗?
char *cad = (char*)malloc(sizeof(char) * 15);
if (!cad) exit(1);
当我想将 char 数组插入另一个数组时,可以使用 realloc 吗?
realloc(*cad, sizeRep + strlen(auxi) + 1);
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *replaceString(char **cad) {
int sizeRep;
char *auxi = *cad, *plec;
char replace[500];
plec = strchr(*cad, '*');
switch (*(plec - 1)) {
case '1':
strcpy(replace, "myDirectory1");
break;
case '2':
strcpy(replace, "MyDirectory2");
}
sizeRep = strlen(replace);
realloc(*cad, sizeRep + strlen(auxi) + 1);
memmove(plec + strlen(replace) - 1, plec + 1, strlen(plec));
memmove(plec - 1, replace, sizeRep);
return auxi;
}
int main() {
char *cad = (char*)malloc(sizeof(char) * 15);
if (!cad) exit(1);
strcpy(cad, "C:/2*/file.txt");
printf("%s", replaceString(&cad));
return 0;
}
在您的示例中,我看不到任何重大问题。不过我喜欢加评论。
- 调用“
realloc
”函数后,如果没有足够的内存可供分配,*cad
的值可能无效。因此,正如 BLUEPIXY 在他的评论中所建议的那样,请注意这一点。 *cad
指针在不同位置使用不同。在main
它是一个指针。但是在replaceString
它是一个双指针。实用上没有问题,因为范围不同。但最好避免这种用法。
您的代码有多个错误:
- 您不检查是否找到
*
以及是否在大于0
的偏移量处找到它。 - 您没有复制空终止符。
- 你的计算差了一个。
- 您没有存储
realloc()
的 return 值
- 您访问了字符串中已重新分配的位置,如果移动了字符串,这可能会出现未定义的行为。请改用偏移量。
2*
的替换与1*
的替换不同。
这是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *replaceString(char **cad) {
char *auxi = *cad;
size_t len = strlen(auxi);
char *plec = strchr(auxi, '*');
if (plec && plec > auxi) {
size_t offset = plec - auxi - 1;
size_t sizeRep;
const char *replace = NULL;
switch (auxi[offset]) {
case '1':
replace = "myDirectory1";
break;
case '2':
replace = "myDirectory2";
break;
default:
return auxi;
}
sizeRep = strlen(replace);
// reallocate auxi: -2 for the characters removed, +1 for the null termnator
auxi = realloc(auxi, len - 2 + sizeRep + 1);
if (auxi == NULL)
return NULL;
memmove(auxi + offset + sizeRep, auxi + offset + 2, len - offset - 2 + 1);
memmove(auxi + offset, replace, sizeRep);
*cad = auxi;
}
return auxi;
}
int main(void) {
char *cad = strdup("C:/2*/file.txt");
if (!cad)
exit(1);
printf("%s\n", replaceString(&cad));
free(str);
return 0;
}
realloc()
是臭名昭著的问题来源,会导致未定义的行为和内存泄漏。您可能希望更改您的函数以使用更简单的 API,始终分配 return 值,而不会对参数产生副作用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *replaceString(const char *src) {
size_t size = strlen(src) + 1;
size_t offset = 0, matchlen = 0, replace_len = 0;
const char *replacement = "";
const char *p;
char *dest;
if ((p = strstr(src, "1*")) != NULL) {
offset = p - src;
match_len = 2;
replacement = "myDirectory1";
replacement_len = strlen(replacement);
} else
if ((p = strstr(src, "2*")) != NULL) {
offset = p - src;
match_len = 2;
replacement = "myDirectory2";
replacement_len = strlen(replacement);
}
dest = malloc(size - match_len + replacement_len);
if (dest) {
memcpy(dest, src, offset);
memcpy(dest + offset, replacement, replacement_len);
memcpy(dest + offset + replacement_len,
src + offset + match_len, size - offset - match_len);
}
return dest;
}
int main(void) {
char *str = replaceString("C:/2*/file.txt");
if (!str)
exit(1);
printf("%s\n", str);
free(str);
return 0;
}