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

喜欢这篇文章吗,不妨分享给朋友们吧!