D 语言字符串替换优化:处理空字符串和边界条件
以下代码示例展示了使用 D 语言进行字符串替换的优化方法,包括处理空字符串、边界条件以及内存分配等问题,并提供了解决方案。
bool charEqual(char a, char b, bool isCaseSensitive) nothrow pure
{
return isCaseSensitive ? a == b : tolower(a) == tolower(b);
}
char* strstrCase(const(char)* haystack, const(char)* needle, bool isCaseSensitive) nothrow
{
const size_t haystackLen = strlen(haystack);
const size_t needleLen = strlen(needle);
if (needleLen > haystackLen)
{
return null;
}
for (size_t i = 0; i <= haystackLen - needleLen; i++)
{
bool found = true;
for (size_t j = 0; j < needleLen; j++)
{
if (!charEqual(haystack[i + j], needle[j], isCaseSensitive))
{
found = false;
break;
}
}
if (found)
{
return cast(char*)(haystack + i);
}
}
return null;
}
char* replaceString(const(char)* allStr, const(char)* searchStr, const(char)* replaceStr, bool isCaseSensitive) nothrow
{
const size_t searchStrLength = strlen(searchStr);
const size_t replaceStrLength = strlen(replaceStr);
if (searchStrLength == 0)
{
return null;
}
const size_t allStrLength = strlen(allStr);
size_t newStrLength = allStrLength + (replaceStrLength - searchStrLength) * countSubstr(allStr, searchStr, isCaseSensitive);
char* result = cast(char*)malloc(newStrLength + 1);
if (result is null)
{
return null;
}
char* dst = result;
const char* src = allStr;
size_t remaining = allStrLength;
while (remaining >= searchStrLength)
{
const char* match = strstrCase(src, searchStr, isCaseSensitive);
if (match is null)
{
break;
}
const size_t length = match - src;
memcpy(dst, src, length);
dst += length;
memcpy(dst, replaceStr, replaceStrLength);
dst += replaceStrLength;
src = match + searchStrLength;
remaining -= length + searchStrLength;
}
memcpy(dst, src, remaining);
dst[remaining] = '\0';
return result;
}
void main()
{
const char* allStr = "hello world World";
const char* searchStr = "World";
const char* replaceStr = "china";
const bool isCaseSensitive = true;
char* result = replaceString(allStr, searchStr, replaceStr, isCaseSensitive);
printf("%s\n", result);
free(result);
}
优化后的代码主要改进了以下几个方面:
- 将字符串参数改为
const(char)*类型,避免不必要的内存分配和复制。 - 在
strstrCase函数中增加了对needle大于haystack的情况的判断,避免不必要的循环。 - 在
replaceString函数中增加了对searchStr为空字符串的判断,以及对malloc返回空指针的判断。 - 在
replaceString函数中增加了对allStr中无需替换的部分直接复制的逻辑,避免不必要的内存复制。
原文地址: https://www.cveoy.top/t/topic/ogu9 著作权归作者所有。请勿转载和采集!