我有以下dlang代码import stdstdio;import corestdcstring;import corestdcstdlib;import corestdcctypetolower; 判断两个字符是否相等根据 isCaseSensitive 参数决定是否区分大小写bool charEqualchar a char b bool isCaseSensitive if isCas
在 replaceAll 函数中,当找到 needle 后,将原来的字符串 oldResult 释放了,然后将指针 result 指向新分配的字符串 newResult,但是在后面的循环中,又使用了原来的指针 result,这里就出现了问题。因为原来的指针已经被释放了,所以访问原来指针指向的内存就会出现段错误。
解决方法是,将指针 result 和指针 oldResult 分开,不要混用。在每次循环中,都使用新分配的指针 newResult 来存储结果,最后将新分配的指针返回即可。修改后的代码如下:
char* replaceAll(char* haystack, const char* needle, const char* replace, bool isCaseSensitive)
{
size_t needleLen = strlen(needle);
size_t replaceLen = strlen(replace);
char* result = haystack;
char* p = strstr(result, needle, isCaseSensitive);
while (p != null)
{
size_t prefixLen = p - result;
size_t suffixLen = strlen(result + prefixLen + needleLen);
size_t newResultLen = prefixLen + replaceLen + suffixLen;
char* newResult = cast(char*)malloc(newResultLen + 1);
memcpy(newResult, result, prefixLen);
memcpy(newResult + prefixLen, replace, replaceLen);
memcpy(newResult + prefixLen + replaceLen, result + prefixLen + needleLen, suffixLen);
newResult[newResultLen] = '\0';
free(result);
result = newResult;
p = strstr(result + prefixLen + replaceLen, needle, isCaseSensitive);
}
return result;
}
``
原文地址: https://www.cveoy.top/t/topic/fr2M 著作权归作者所有。请勿转载和采集!