这是我想做的一个例子 我有以下列表
[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/