我有一个char数组,我想将1*或2*替换为myDirectory1或myDirectory2
例:C:/1*/file.txt -> C:/MDirectory1/file.txt
例:C:/2*/file.txt -> C:/MDirectory2/file.txt
我的代码似乎起作用了,但我不明白一些事情:
初始化这样的动态char数组可以吗?
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;
}发布于 2017-07-13 06:26:00
您的代码有多个错误:
*,是否在大于0的偏移量中找到了它。realloc()的返回值。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,始终分配返回值,而不会对参数产生副作用:
#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;
}发布于 2017-07-13 05:11:24
在你的例子中,没有我能看到的重大问题。但我想补充一些评论。
realloc“函数之后,如果没有足够的内存来分配,则*cad的值可能无效。因此,正如BLUEPIXY在他的评论中所建议的那样,要意识到这一点。*cad指针在不同的位置中使用不同。在main中,它是一个指针。但是在replaceString中,它是一个双指针。实际上,没有问题,因为范围是不同的。但最好避免这样的使用。https://stackoverflow.com/questions/45069389
复制相似问题