在其他字符数组中替换字符数组

Replace char array in other char array

我有一个字符数组,我想用 1*2* 替换 myDirectory1myDirectory2

例如: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;
}