我有以下D语言代码帮我优化下替换的时候判断是否是空字符串和边界等问题:import corestdcstdioprintf;import corestdcstring;import corestdcstdlib malloc free;import corestdcctypetolower; 判断两个字符是否相等根据 isCaseSensitive 参数决定是否区分大小写bool charEqu
以下是优化后的代码:
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/fr3Q 著作权归作者所有。请勿转载和采集!