我有一个字符数组,我希望将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;
}
答案 0 :(得分:0)
在您的示例中,我没有看到任何重大问题。但我想补充一下评论。
realloc
&#34;如果没有足够的内存来分配,*cad
的值可能无效。所以要注意它,正如BLUEPIXY在他的评论中所建议的那样。*cad
指针在各种位置使用不同。在main
中它是一个指针。但在replaceString
中,它是一个双指针。实际上没有问题,因为范围不同。但最好避免这种用法。答案 1 :(得分:0)
您的代码有多处错误:
*
以及是否找到了大于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;
}