c - 替换字符串中的单词

标签 c string strcmp strstr

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

[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 做错了什么吗?我似乎无法找出我做错的地方。

最佳答案

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

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

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

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

  • 您的代码不会检查第一个 malloc 的返回值。
  • 您的代码错误计算了结果的长度:您应该减去单词“token”的长度,因为您将其替换为repl的内容,即应该是 malloc(strlen(src) + strlen(repl) - strlen(find) + 1)
  • 您不需要在 C 中转换 malloc 的返回值
  • 您不需要将长度乘以 sizeof(char)(只有两个 malloc 之一可以做到这一点)
  • 您的第二次提前返回导致内存泄漏。

关于c - 替换字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18314559/

相关文章:

c - 如何在 OpenMP 中并行化这个 for 循环?

c# - 将文件中的数据加载并解析到数组中

Python 字符限制器

c - 检查字符串是否存在于 C 链表中的函数

c - 使用结构体数组进行选择排序,使用 strcmp 进行排序

在 Visual Studio 2005 中编译 lighttpd

检查何时同时包含两个 header

c - Pthread 参数

c++ - 对字符数组感到困惑

c - 在 C 中合并文本文件