替换其他char数组中的char数组

时间:2017-07-13 00:03:01

标签: c arrays dynamic realloc

我有一个字符数组,我希望将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;
}

2 个答案:

答案 0 :(得分:0)

在您的示例中,我没有看到任何重大问题。但我想补充一下评论。

  • 致电&#34; 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;
}