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