C++中如何使用多字符分隔符替代getline函数
多字符分隔符(||)分割宽字符字符串的实现方案
需求背景
标准库的getline函数不支持多字符分隔符,现需以双竖线||作为分隔符分割宽字符字符串,要求使用vector存储结果,且不能使用strstr或strtok函数。
原单竖线分割代码(存在问题)
原代码使用单竖线|作为分隔符,无法满足||分隔的需求,代码如下:
wchar_t *sGroups = L"group1||group2||group3"; wstringstream wSS(sGroups); wstring wOut; vector<wstring> vGroup; while (wSS.good()) { //getline(wSS, wOut, L'||'); // <- 此写法对getline无效 getline(wSS, wOut, L'|'); vGroup.push_back(wOut); } size_t i = 0; wchar_t sGroup[256]{}; while (i < vGroup.size()) { if (vGroup[i].length() > 0) { StringCchCopyW(sGroup, 256, vGroup[i].c_str()); // 对sGroup执行业务逻辑 } i++; }
解决方案:自定义多字符分隔的getlinemultiple函数
针对宽字符(wchar_t)实现支持多字符分隔的自定义函数getlinemultiple,替代原getline函数:
std::wstring getlinemultiple(std::wistream& in, std::wstring delimiter) { std::wstring cr; wchar_t delim = *(delimiter.rbegin()); size_t sz = delimiter.size(), tot; do { wstring temp; getline(in, temp, delim); cr += temp + delim; tot = cr.size(); } while ((tot < sz) || (cr.substr(tot - sz, sz) != delimiter)); return cr.substr(0, tot - sz); // 若需保留分隔符,可改为 return cr; }
修改后的代码
将原代码中的getline调用替换为自定义函数即可,修改后的完整代码如下:
wchar_t *sGroups = L"group1||group2||group3"; wstringstream wSS(sGroups); wstring wOut; vector<wstring> vGroup; while (wSS.good()) { wOut = getlinemultiple(wSS, L"||"); vGroup.push_back(wOut); } size_t i = 0; wchar_t sGroup[256]{}; while (i < vGroup.size()) { if (vGroup[i].length() > 0) { StringCchCopyW(sGroup, 256, vGroup[i].c_str()); // 对sGroup执行业务逻辑 } i++; }
内容的提问来源于stack exchange,提问作者JeffR
相关产品推荐
相关产品推荐

