基于CString实现自定义Tokenize函数的技术咨询
嘿,看来你正在尝试用CString实现一个自定义的Tokenize函数,专门处理以(ENDWPT)为分隔符的文本对吧?我正好有个清晰的实现方案,结合你提到的定位分隔符、提取文本的思路,给你整理出来了。
实现思路
- 首先确定分隔符的固定长度:
(ENDWPT)的长度是8,提前定义好可以避免硬编码带来的错误 - 循环查找分隔符的位置:每次找到后,提取当前起始位置到分隔符前的子串,再把起始位置更新到分隔符之后,继续下一轮查找
- 处理末尾剩余文本:循环结束后,别忘了把最后一段没有分隔符的内容也加入结果集合
完整代码示例
#include <afx.h> #include <vector> std::vector<CString> CustomTokenize(const CString& input, const CString& delimiter) { std::vector<CString> tokens; // 空输入或空分隔符直接返回空集合 if (input.IsEmpty() || delimiter.IsEmpty()) { return tokens; } int delimiterLen = delimiter.GetLength(); int startPos = 0; int foundPos = input.Find(delimiter, startPos); while (foundPos != -1) { // 提取当前起始位置到分隔符前的子串 CString token = input.Mid(startPos, foundPos - startPos); // 可选:去掉token前后的空白字符(根据你的需求调整) token.Trim(); if (!token.IsEmpty()) { tokens.push_back(token); } // 更新起始位置到分隔符的下一个字符 startPos = foundPos + delimiterLen; // 继续查找下一个分隔符 foundPos = input.Find(delimiter, startPos); } // 处理最后一段没有分隔符的文本 CString finalToken = input.Mid(startPos); finalToken.Trim(); if (!finalToken.IsEmpty()) { tokens.push_back(finalToken); } return tokens; } // 测试用例 int main() { CString inputText = _T("11111 22222 (ENDWPT) 222222 333333 (ENDWPT) 6060606 ggggggg hhhhhhh (ENDWPT) iiiiiii jjjjjjj kkkkkkk lllllll mmmmmmm nnnnnnn"); CString delimiter = _T("(ENDWPT)"); std::vector<CString> result = CustomTokenize(inputText, delimiter); // 输出分词结果 for (const auto& token : result) { wprintf(_T("%s\n"), token.GetString()); } return 0; }
关键细节说明
- 分隔符查找:使用
CString::Find方法,每次从更新后的startPos开始查找,确保不会重复匹配同一个分隔符 - 子串提取:
CString::Mid方法的第二个参数是子串长度,这里用foundPos - startPos刚好得到分隔符前的有效内容长度 - 空白处理:
Trim()方法是可选操作,如果你的需求需要保留token前后的空格(比如原始文本中的空格),可以直接去掉这一步 - 边界判断:加入了空输入和空分隔符的判断,避免程序出现异常
内容的提问来源于stack exchange,提问作者Alexander Lopez
相关产品推荐
相关产品推荐

