C 替换字符串中的单词

C 替换字符串中的单词,c,string,strcmp,strstr,C,String,Strcmp,Strstr,这是我想做的一个例子 我有以下清单 [token] [token1] [token22] [token99] [8token] [3token3] 我想删除[然后]用我自己的单词替换单词token。因此,我有以下代码: char *getToken(char *repl, char *mysrc) { const char *p1 = strstr(mysrc,"[")+1; const char *p2 = strstr(p1,"]"); size_t len = p

这是我想做的一个例子 我有以下清单

[token]
[token1]
[token22]
[token99]
[8token]
[3token3]
我想删除[然后]用我自己的单词替换单词token。因此,我有以下代码:

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


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

当移除方括号后,令牌字符串结束于字符串的开头时,可能会发生这种情况:在这种情况下,size_tfound-src的计算结果为零,因此

strncpy(res, src, (size_t)(found - src));
根本不更改res字符串,留下任何垃圾,以便在追加之前跳过下面的strcat调用。幸运的是,res中的垃圾恰好是一个以null结尾的短字符串,例如X或H。否则,您可能会得到一个更长的任意字符字符串

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

您的代码不检查第一个malloc的返回值。 您的代码错误计算了结果的长度:您应该减去单词标记的长度,因为您将其替换为repl的内容,即它应该是mallocstrlensrc+strlenrepl-strlenfind+1 您不需要在C中强制转换malloc的返回值 您不需要将长度乘以sizeofchar,只有两个Malloc中的一个可以这样做 您的第二次提前返回会泄漏内存。
移除方括号后,当标记字符串结束于字符串的开头时,可能会发生这种情况:在本例中,size_tfound-src的计算结果为零,因此

strncpy(res, src, (size_t)(found - src));
根本不更改res字符串,留下任何垃圾,以便在追加之前跳过下面的strcat调用。幸运的是,res中的垃圾恰好是一个以null结尾的短字符串,例如X或H。否则,您可能会得到一个更长的任意字符字符串

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

您的代码不检查第一个malloc的返回值。 您的代码错误计算了结果的长度:您应该减去单词标记的长度,因为您将其替换为repl的内容,即它应该是mallocstrlensrc+strlenrepl-strlenfind+1 您不需要在C中强制转换malloc的返回值 您不需要将长度乘以sizeofchar,只有两个Malloc中的一个可以这样做 您的第二次提前返回会泄漏内存。
仅供参考,最后一次提前返回是内存src泄漏。另外,strnlen比strlen安全得多。您试过调试它吗?您不必强制转换malloc的返回值,也不必使用sizeofchar。内存泄漏可能是原因之一吗?如何避免内存泄漏?仅供参考,最后一次提前返回是内存src泄漏。另外,strnlen比strlen安全得多。您试过调试它吗?您不必强制转换malloc的返回值,也不必使用sizeofchar。内存泄漏可能是原因之一吗?如何避免内存泄漏?我假设您了解如何修复未定义的行为:在调用strncpy之前,只需将res[0]设置为“\0”。非常感谢您的详细回答。我会试试这个,然后发布一个更新。它现在运行得很好。非常感谢。您能给我一个关于如何避免第二次返回时内存泄漏的提示吗?@SamReina避免内存泄漏的一种方法是在if found==NULL条件中释放并返回src。我假设您了解如何修复未定义的行为:您只需要设置res[0]请在致电strncpy之前发送至“\0”。非常感谢您的详细答复。我会试试这个,然后发布一个更新。它现在运行得很好。非常感谢。你能给我一个关于如何避免第二次返回时内存泄漏的提示吗?@SamReina避免内存泄漏的一种方法是在if found==NULL条件中释放并返回src。