|
- void StringUtil::Split(const CString& text, const ACHAR* separator, std::vector<CString>& result, bool bAddEmptyStr)
- {
- int prev = 0, current = 0;// 初始化两个指针,prev(前一个索引号)和current(当前索引号),都设置为0
- CString strCopyTxT = text;// 创建一个text的副本,并去除其右边的空格
- strCopyTxT.TrimRight(采用T(" "));
- if (strCopyTxT.Find(separator,0)<0)//如果在副本中找不到分隔符,未找到返回-1,那么整个副本就是一个单独的字符串
- {
- if (strCopyTxT.GetLength()>0)
- {
- result.push采用back(strCopyTxT);// 如果副本的长度大于0,则将其添加到字符串容器中
- }
- // 如果传入的字符串长度为0,啥也不添加
- return;
- }
- // 以下为至少发现一个分隔符,获得字符串总长度
- int length = strCopyTxT.GetLength();// 初始化一个标志位,表示是否已经找到了所有的分隔符
- bool bExit = false;
- while (true)// 开启无限循环:注意循环中的break语句
- {
- current = strCopyTxT.Find(separator, prev); // 在副本中查找分隔符,从prev指针的位置开始查找
- if (current == -1)// 到最后一组了
- {
- current = length;
- bExit = true;// 如果找不到分隔符,将整个字符串长度赋值current,标识退出变量为真
- }
- // 取最后一个分隔符到结尾的字符串,Mid见下注释
- CString item = strCopyTxT.Mid(prev, current - prev);
-
- if (bAddEmptyStr || item.GetLength()>0)
- { // 添加进容器的条件:每个提取的子字符串是否过滤0长度
- result.push采用back(item);// 如果bAddEmptyStr为true,或者子字符串的长度大于0,则将子字符串添加到结果列表中
- }
- if (bExit)
- {
- break;// 如果已经找到了所有的分隔符,那么跳出循环
- }
- prev = current + int(采用tcslen(separator)); // 将prev指针移动到当前分隔符的后面,以便在下一次循环中查找下一个分隔符
- }
- }
- // 合并字符串:传入字符串容器、分隔符,返回合并的字符串
- CString StringUtil::Join(const std::vector<CString>& items, const ACHAR *spearator)
- {
- CString strResult;// 逐个拼接容器中的字符串
- for (int i = 0; i < items.size();i++)
- {
- strResult += items.at(i) + spearator;
- }// 删除右侧的空字符
- strResult.TrimRight(spearator);//调用'TrimRight'函数,从'strResult'的右侧删除所有的分隔符。这样做是为了避免在最后一个元素后面出现不必要的分隔符
- return strResult;// 返回拼接好的字符串
- }
复制代码 |
|