在近的一个项目中,需要实现几万字符的查找替换,我使用CString的Replace花了两个小时,才完成替换。使用stl的string,花了大概6分钟。
万般无赖,使用char*,自己实现查找替换吧,在1秒以内完成了替换。参考了网上的代码。
直接上代码吧。
void CWebTransfer::Substitute(char *pInput, char *pOutput, char *pSrc, char *pDst)
{
char *pi, *po, *p;
int nSrcLen, nDstLen, nLe
在C++编程中,处理字符串查找与替换是一个常见的任务,特别是在大数据量的文本处理中,效率至关重要。在上述描述的场景中,作者遇到了一个需要高效查找并替换几万字符的问题。起初,尝试使用MFC库中的`CString`类的`Replace`函数,但发现执行时间过长,耗时两个小时。然后尝试了STL中的`std::string`,虽然比`CString`快,但也花费了大约六分钟。最终,通过使用原始的C风格字符串`char*`,自行实现查找和替换功能,将时间缩短至一秒钟以内。
下面详细解释这段代码的工作原理:
定义了四个`char*`指针变量:`pi`用于指向输入字符串,`po`指向输出字符串,`pSrc`指向要查找的子串,`pDst`指向替换后的子串。同时,计算了`pSrc`和`pDst`的长度`nSrcLen`和`nDstLen`,这在后续的替换操作中是非常关键的。
接下来,使用`strstr`函数查找输入字符串`pInput`中第一次出现`pSrc`的位置。如果找到了,`strstr`会返回一个指针,指向匹配的子串起始位置。然后进入一个循环,不断地查找并替换子串:
1. 计算当前子串前边的字符串长度`nLen`。
2. 使用`memcpy`函数将这部分未匹配的字符串复制到输出字符串`pOutput`。
3. 将`pDst`(替换后的子串)复制到`pOutput`,覆盖原来的子串。
4. 更新指针`pi`和`po`,以便处理下一个匹配的子串。
5. 重复这个过程,直到`strstr`找不到匹配的子串为止。
如果`strstr`没有找到任何匹配,那么整个输入字符串会被原样复制到输出字符串。这样就完成了整个查找替换的过程。
这个方法之所以高效,是因为它避免了`CString`和`std::string`在进行查找替换时可能涉及的额外内存分配和拷贝操作。原始的C风格字符串和`memcpy`函数提供了较低级别的内存操作,可以直接在内存块之间移动数据,从而减少了性能开销。
然而,这种方法也有其局限性。它不适用于需要考虑Unicode或宽字符的情况,也不提供错误检查和异常处理机制,可能导致内存溢出或数据损坏。在实际应用中,为了保证代码的健壮性和可维护性,可能需要添加更多的安全措施和错误处理代码。此外,对于非常大的字符串,可能需要考虑更高级的数据结构,如后缀树或后缀数组,来进一步提高查找效率。