2

这是我想做的一个例子我有以下列表

[token]
[token1]
[token22]
[token99]
[8token]
[3token3]

我想删除“[”和“]”,然后用我自己的词替换词令牌。所以我有以下代码:

char *getToken(char *repl, char *mysrc)
{
    const char *p1 = strstr(mysrc,"[")+1;
    const char *p2 = strstr(p1,"]");
    size_t len = p2-p1;
    char *src = (char*)malloc(sizeof(char)*(len+1));
    strncpy(src,p1,len);
    src[len] = '\0';

    char *find = "token";
    char *found;
    if(strcmp(src,find) == 0)
        return src;
    char *res = malloc(strlen(src) + strlen(repl) + 1);
    if (res == NULL)
        return src;
    found = strstr(src, find);
    /* Search string not found, return the whole of the source */
    if (found == NULL){
        strcpy(res, src);
        return res;
    }
    /* Paste the replacement string in */
    strncpy(res, src, (size_t)(found - src));
    strcat(res, repl);
    strcat(res, found + strlen(find));
    free(src);
    return res;
}

除了在某些情况下我在结果前面得到一个 X 或 H 之外,它工作得很好。像这样:Xtest22 而不是 test22

我对strlen做错了吗?我似乎无法找出我做错了什么。

4

1 回答 1

4

"token"字符串在删除方括号后结束于字符串的开头时,可能会发生这种情况:在这种情况下,(size_t)(found - src)计算结果为零,因此调用

strncpy(res, src, (size_t)(found - src));

根本不改变字符串,留下任何垃圾,以便在追加之前跳过res以下调用。strcat您很幸运,其中的垃圾res恰好是一个以空字符结尾的短字符串,例如 an"X"或 an "H"。否则,您可能会得到更长的任意字符字符串。

除了修复上述未定义的行为之外,您还应该修复一些其他问题:

  • 您的代码不检查 first 的返回值malloc
  • 您的代码错误计算了结果的长度:您应该减去 word 的长度"token",因为您将其替换为 的内容repl,即它应该是malloc(strlen(src) + strlen(repl) - strlen(find) + 1)
  • 您不需要转换mallocC中的返回值
  • 您不需要将长度乘以sizeof(char)(只有两个mallocs 中的一个这样做)
  • 您的第二次提前返回会泄漏内存。
于 2013-08-19T13:19:53.570 回答