如何替换LPTSTR类型变量的值?有哪些不同于现有方案的实现方法?
LPTSTR(wchar_t* 类型)字符串替换的替代方案
重要前提:所有直接写入原
LPTSTR缓冲区的方案,都必须保证原指针指向的内存空间足够容纳替换后的完整宽字符串,否则会发生缓冲区溢出,引发未定义行为。如果原缓冲区空间不足,需要先申请足够的新内存再操作。
方案1:仅使用C++标准库,无第三方依赖
标准库没有内置的全局替换接口,可以自己实现宽字符版本的替换逻辑,不需要引入boost库:#include <string> #include <wchar.h> void wstring_replace_all(std::wstring& str, const std::wstring& from, const std::wstring& to) { size_t start_pos = 0; while((start_pos = str.find(from, start_pos)) != std::wstring::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); // 避免替换内容包含被替换串时出现死循环 } } // 调用示例 LPTSTR in; // ... 原有in的赋值逻辑 std::wstring wstr(in); wstring_replace_all(wstr, L"in", L","); wcscpy(in, wstr.c_str());方案2:纯C风格实现,不依赖C++标准库
仅用C标准库的宽字符操作函数手动实现替换,适合纯C项目:#include <wchar.h> #include <stdlib.h> void wchar_replace_all(wchar_t* buf, size_t buf_capacity, const wchar_t* from, const wchar_t* to) { size_t from_len = wcslen(from); size_t to_len = wcslen(to); wchar_t* cur_pos = buf; wchar_t* temp_buf = (wchar_t*)calloc(buf_capacity, sizeof(wchar_t)); size_t write_offset = 0; while ((cur_pos = wcsstr(cur_pos, from)) != NULL) { // 拷贝匹配位置之前的内容 wcsncpy(temp_buf + write_offset, buf + write_offset, cur_pos - (buf + write_offset)); write_offset += cur_pos - (buf + write_offset); // 拷贝替换后的内容 wcscpy(temp_buf + write_offset, to); write_offset += to_len; // 跳过原匹配的子串 cur_pos += from_len; } // 拷贝剩余未匹配的内容 wcscpy(temp_buf + write_offset, cur_pos); // 安全校验后写回原缓冲区 if (wcslen(temp_buf) < buf_capacity) { wcscpy(buf, temp_buf); } free(temp_buf); } // 调用示例,假设in指向的缓冲区容量为256个宽字符 wchar_replace_all(in, 256, L"in", L",");方案3:Windows平台原生API实现
Windows SDK 提供了现成的宽字符替换接口StrReplaceW,无需自己实现替换逻辑,需要链接Shlwapi.lib:#include <windows.h> #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") // 调用示例 LPTSTR in; // ... 原有in的赋值逻辑 StrReplaceW(in, L"in", L",", 0);
如果原LPTSTR指向的缓冲区空间不足,可以先计算替换后的字符串长度,申请新的内存再赋值:
// 以方案1的自定义替换函数为例 std::wstring wstr(in); wstring_replace_all(wstr, L"in", L","); // 申请新的堆内存,注意后续使用对应函数释放内存(此处用LocalAlloc对应LocalFree) LPTSTR new_in = (LPTSTR)LocalAlloc(LPTR, (wstr.size() + 1) * sizeof(wchar_t)); wcscpy(new_in, wstr.c_str());
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

