如何用c语言批量替换字符串,[C/C++]急速批量替换字符串

最近在家自学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);

}

}

因为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;

}

使用方法:

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值