欢迎莅临阿Q的项目

专业WP商业设计开发销售中心

[C/C++]急速批量替换字符串

最近在家自学C++的Windows应用程序编程,本来用Dev c++学习的好好的,一时心血来潮,想独立安装MinGW、用任意编辑器编写代码、手写makefile并自主编译运行,结果麻烦来了,在Dev C++下可以正常编译并运行的代码在MinGW下无法运行了。

最近在家自学C++的Windows应用程序编程,本来用Dev c++学习的好好的,一时心血来潮,想独立安装MinGW、用任意编辑器编写代码、手写makefile并自主编译运行,结果麻烦来了,在Dev C++下可以正常编译并运行的代码在MinGW下无法运行了。

主要问题集中在字符串类型的转换和字符替换的问题上。

在网上搜索了一下,先用std::string作为替换和转换的基础,关于LPWSTR和std::string之间的转换把我磨的焦头烂额。后来网上找到一篇文章说用CString和string速度都不快,直接在内存中替换是最快的,代码如下:

void CWebTransfer::Substitute(char *pInput, char *pOutput, char *pSrc, char *pDst)
{
char *pi, *po, *p;
int nSrcLen, nDstLen, nLen;
// .
pi = pInput;
// .
po = pOutput;
// .
nSrcLen = strlen(pSrc);
nDstLen = strlen(pDst);
// pi,(null).
p = strstr(pi, pSrc);
if(p)
{
// .
while(p)
{
// .
nLen = (int)(p - pi);
// .
memcpy(po, pi, nLen);
memcpy(po + nLen, pDst, nDstLen);
// .
ppi = p + nSrcLen;
// .
popo = po + nLen + nDstLen;
// .
p = strstr(pi, pSrc);
}
// .
strcpy(po, pi);
}
else
{
// .
strcpy(po, pi);
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

因为char*是不推荐使用的,所以我将其改为LPTSTR:

//
LPTSTR Substitute(LPTSTR pInput, LPCTSTR pSrc, LPCTSTR pDst) {
LPTSTR pi, p, po, pOutput;
int nSrcLen, nDstLen, nLen, offset=0;
pi = pInput;
// .
nSrcLen = strlen(pSrc);
nDstLen = strlen(pDst);
// pi,(null).
p = strstr(pInput, pSrc);
if(p) {
// .
while(p) {
// .
nLen = (int)(p - pi);
// .
memcpy(po, pi, nLen);
//
memcpy(po + nLen, pDst, nDstLen);
//MessageBox(NULL, po, TEXT("error"), MB_OK);
// .
pi = p + nSrcLen;
// .
po = po + nLen + nDstLen;
offset += nLen + nDstLen;
// .
p = strstr(pi, pSrc);
}
// .
memcpy(po, pi, strlen(pi));
//
pOutput = po-offset;
} else {
// .
pOutput = pi;
}
return pOutput;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

使用方法:

LPBYTE lpByte = (LPBYTE)TEXT("Q!%1%1%2%1321212");
LPTSTR keyValue, tmp = (LPTSTR)lpByte;
keyValue = Substitute(tmp, TEXT("%1"), TEXT(""));
MessageBox(NULL, keyValue, TEXT("error"), MB_OK);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
如果喜欢本文,请分享给朋友们