CString 逆向查找字符串

本文介绍了一种使用C++实现的字符串搜索方法,该方法通过逆向查找特定字符并逐步缩小搜索范围来定位目标子字符串的位置。这种方法适用于需要从大量文本中快速定位含有特定名称行的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  AllInput 待查找的完整字符串,key 被查找的子字符串
   {
     CString AllInput = GetAllTxt();
     CString key = _T("/r/n")+strGuestName;
    
     CString strLastInput;
     CString stemp = AllInput;
     int pos = stemp.ReverseFind('/r');
     while (pos>0)
     {
      CString sSub = stemp.Mid(pos); // 获得最后1行字符串
      if (sSub.Find(key)>=0)
      {
       // 最后1行字符串找到匹配字段
       strLastInput = AllInput.Mid(pos);
       break;
      }
      else
      {
       // 在最后1行字符串(pos右边)没有找到匹配字段,把右边部分截掉,用ReverseFind继续向左查找匹配字段
       stemp = stemp.Left(pos);
       pos = stemp.ReverseFind('/r');
      }
     }
    }

<think>我们正在讨论CString查找字符串的用法。根据引用[1],CString类提供了多种方法来操作字符串,包括查找字符串。 在MFCCString类中,查找字符串主要有两个方法:Find和FindOneOf。 1. Find方法用于查找字符串或字符首次出现的位置。 2. FindOneOf方法用于查找字符串中任何指定字符首次出现的位置。 具体用法如下: - int Find( TCHAR ch ) const; // 查找单个字符 - int Find( LPCTSTR lpszSub ) const; // 查找字符串 - int Find( TCHAR ch, int nStart ) const; // 从指定位置开始查找字符 - int Find( LPCTSTR pstr, int nStart ) const; // 从指定位置开始查找字符串 返回值:如果找到,返回子字符串(或字符)在原字符串中的从0开始的索引;如果没有找到,返回-1。 另外,还有一个反向查找的方法ReverseFind,用于从字符串末尾开始查找字符(注意:只能查找单个字符,不能查找字符串)。 示例代码: ```cpp CString str = _T("This is a test string."); int nIndex; // 查找字符串"test" nIndex = str.Find(_T("test")); // nIndex 现在为10 // 从位置5开始查找字符's' nIndex = str.Find(_T('s'), 5); // nIndex 现在为6(因为第一个's'在位置3,第二个在位置6) // 反向查找字符's' nIndex = str.ReverseFind(_T('s')); // nIndex 现在为15(从末尾开始找,找到的是倒数第二个's',因为最后一个字符是'.',而前面的's'在位置15) ``` 注意:这些方法都是区分大小写的。如果需要不区分大小写的查找,可以使用CStringT::MakeUpper或CStringT::MakeLower将字符串转换为统一大小写后再查找,或者使用其他方法(如CStringT::FindNoCase,但注意CString本身并没有直接提供FindNoCase方法,在MFC中通常需要转换为统一大小写)。 另外,CString还提供了FindOneOf方法,用于查找字符串中第一个与指定字符集合中任意字符匹配的字符的位置。 例如: ```cpp CString str = _T("Hello World"); int nIndex = str.FindOneOf(_T("aeiou")); // 查找第一个元音字母的位置 // nIndex 现在为1(因为第一个元音字母是'e',在位置1) ``` 根据需求,如果只是查找字符串,主要使用Find方法。 因此,针对用户的问题“CString find substring usage in C++”,我们可以总结为使用CString的Find方法,并注意参数和返回值。 下面是一个完整的示例程序: ```cpp #include <afx.h> int main() { CString str = _T("The quick brown fox jumps over the lazy dog"); CString sub = _T("fox"); int nPos = str.Find(sub); if (nPos != -1) { _tprintf(_T("Found '%s' at position %d\n"), sub.GetString(), nPos); } else { _tprintf(_T("Substring not found\n")); } return 0; } ``` 输出:Found 'fox' at position 16 注意:使用CString需要包含afx.h,并且项目设置中要使用MFC库(如使用MFC共享库或静态库)。 如果是在非MFC项目中使用CString,可以使用ATL中的CString(在atlstr.h中),用法类似。 另外,在Visual C++中,如果使用Unicode字符集,则_T宏会将字符串转换为Unicode字符串;如果使用多字节字符集,则转换为ANSI字符串。 以上就是在C++中使用CString查找字符串的基本用法。</think>### CString 查找字符串的用法 (C++) 在 MFC/ATL 的 `CString` 类中,查找字符串主要使用以下方法: #### 1. **`Find()` 方法** 查找字符串首次出现的位置: ```cpp int Find(LPCTSTR lpszSub) const; // 查找字符串 int Find(TCHAR ch) const; // 查找单个字符 int Find(LPCTSTR lpszSub, int iStart) const; // 从指定位置开始查找 ``` **示例代码**: ```cpp CString str = _T("Hello World"); int pos; // 查找字符串 pos = str.Find(_T("World")); // 返回 6 pos = str.Find(_T("Universe")); // 返回 -1 (未找到) // 查找字符 pos = str.Find(_T('o')); // 返回 4 // 从指定位置查找 pos = str.Find(_T('o'), 5); // 返回 7 (从索引5开始) ``` #### 2. **`ReverseFind()` 方法** 从字符串末尾反向查找字符: ```cpp int ReverseFind(TCHAR ch) const; ``` ```cpp pos = str.ReverseFind(_T('o')); // 返回 7 (最后一个 'o') ``` #### 3. **`FindOneOf()` 方法** 查找字符集合中任意字符首次出现的位置: ```cpp int FindOneOf(LPCTSTR lpszCharSet) const; ``` ```cpp pos = str.FindOneOf(_T("aeiou")); // 返回 1 (第一个元音 'e') ``` --- ### 关键特性说明 1. **返回值**: - 找到时:返回基于 0 的索引位置 - 未找到:返回 -1 2. **大小写敏感**: 所有查找操作默认**区分大小写**。如需不区分大小写,需先转换大小写: ```cpp CString str1 = _T("Hello"); CString str2 = _T("hello"); int pos = str1.MakeLower().Find(str2.MakeLower()); // 返回 0 ``` 3. **多字节/Unicode 支持**: 使用 `_T()` 宏确保代码兼容多字节和 Unicode 字符集: ```cpp CString str = _T("中文字符串"); int pos = str.Find(_T("文字")); // 正确查找中文字符 ``` 4. **性能说明**: - `Find()` 使用 Boyer-Moore 算法,时间复杂度接近 O(n) - 避免在循环中重复创建 `CString` 对象[^1] --- ### 完整示例 ```cpp #include <atlstr.h> // ATL 版本的 CString int main() { CString data = _T("C++ CString demo"); // 查找子串 int pos = data.Find(_T("String")); if (pos != -1) { TRACE(_T("Found at position: %d\n"), pos); // 输出: Found at position: 4 } // 反向查找字符 pos = data.ReverseFind(_T('+')); TRACE(_T("Last '+' at: %d\n"), pos); // 输出: Last '+' at: 2 return 0; } ``` > **提示**:在 MFC 项目中直接使用 `CString`;在非 MFC 项目中包含 `<atlstr.h>` 使用 ATL 实现的 `CString`[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值