CString相关

本文详细介绍了CString类型的特点,包括在调试过程中的显示限制及其实际容量,并提供了CString与其他常见字符串类型如string和char*之间的转换方法。同时,文章还讨论了CString在内存管理和格式化输出方面的特性。

A   在debug时无法查看CString类型的值?

在生存期内,需要全编译一次工程,这是因为CString类型的特殊设计,这样才能观察CString类型变量的值。

 

B  CString类型有大小限制嘛?

调试是只显示部分数据,可能是为了不过分占据桌面窗口,而其在内存中数据是正确的。

A CString object can store up to INT_MAX (2,147,483,647) characters. The TCHAR data type is used to get or set individual characters inside a CString object. Unlike character arrays, the CString class has a built-in memory allocation capability. This allows CString objects to automatically grow as needed (that is, you don’t have to worry about growing a CString object to fit longer strings).

 

C   CString类型和string,char *的转换

引自:http://www.cppblog.com/robinson119/archive/2007/04/26/22870.aspx,有更改

 

这三种类型各有各的优点,比如

CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。

string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;

char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。所以熟练掌握三者之间的转换十分必要。

转换方法如下:

1 string to CString   

  CString.format("%s",string.c_str()); 

2 CString to string

string str(CString.GetBuffer(str.GetLength()));

3 string to char *

char *p=string.c_str();

4 char * to string

string str(char*);

5 CString to char *

a. 强制转换

        CString theString( (_T("Char test "));
        LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

b. strcpy    strcpy(char,CString,sizeof(char));

       CString theString( (_T("Char test "));
       LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
        _tcscpy(lpsz, theString);
  需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

c. CString::GetBuffer

 

   如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。 如果你只是打算修改字符或者截短字符串,例如:
       CString s(_T("Char test "));
        LPTSTR p = s.GetBuffer(); 

        LPTSTR dot = strchr(p, ''.'');

         // 在这里添加使用p的代码

          if(p != NULL) 

         *p = _T('');
         s.ReleaseBuffer();                     // 使用完后及时释放,以便能使用其它的CString成员函数

         在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

6 char * to CString

a. 直接赋值

b. CString.format("%s",char*);

e.g:

        char chArray[] = "Char  test";
         TCHAR * p = _T("Char  test");( 或LPTSTR p = _T("Char  test");)
         CString theString = chArray;
         theString.Format(_T("%s"), chArray);
         theString = p;

 CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *转换时,要把char定义成为const char*,这样是最安全的。

 

D    其它数据类型转换为字符串  
   
  1。短整型(int)  
  itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制  
  itoa(i,temp,2);   ///按二进制方式转换    
  2。长整型(long)  
  ltoa(l,temp,10);    
  3。浮点数(float,double)  
  用fcvt可以完成转换,这是MSDN中的例子:  
  int   decimal,   sign;    
  char   *buffer;    
  double   source   =   3.1415926535;    
  buffer   =   _fcvt(   source,   7,   &decimal,   &sign   );    
  运行结果:source:   3.1415926535   buffer:   '31415927'   decimal:   1   sign:   0  
  decimal表示小数点的位置,sign表示符号:0为正数,1为负数    
  4。CString变量  
  str   =   "2008北京奥运";  
  buf   =   (LPSTR)(LPCTSTR)str;    
  5。BSTR变量  
  BSTR   bstrValue   =   ::SysAllocString(L"程序员");    
  char   *   buf   =   _com_util::ConvertBSTRToString(bstrValue);    
  SysFreeString(bstrValue);    
  AfxMessageBox(buf);    
  delete(buf);    
  6。CComBSTR变量  
  CComBSTR   bstrVar("test");    
  char   *buf   =   _com_util::ConvertBSTRToString(bstrVar.m_str);    
  AfxMessageBox(buf);    
  delete(buf);    
   
  7。_bstr_t变量  
  _bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用  
  _bstr_t   bstrVar("test");    
  const   char   *buf   =   bstrVar;///不要修改buf中的内容    
  AfxMessageBox(buf);    
   
   
  8。通用方法(针对非COM数据类型)  
  用sprintf完成转换  
  char     buffer[200];  
  char     c   =   '1';  
  int       i   =   35;  
  long     j   =   1000;  
  float   f   =   1.7320534f;  
  sprintf(   buffer,   "%c",c);  
  sprintf(   buffer,   "%d",i);  
  sprintf(   buffer,   "%d",j);  
  sprintf(   buffer,   "%f",f);

<think>首先,用户的问题是:“CString 反向查找CString位置”,这看起来像是关于编程的,具体是关于“CString”的。CString 是 MFC(Microsoft Foundation Classes)中的一个类,用于处理字符串。问题似乎是关于如何在 CString 对象中反向查找另一个 CString 的位置。 我需要理解用户的问题:"CString 反向查找CString位置"。可能的意思是“如何在 CString 中反向查找另一个 CString 的子字符串位置”。CString 有一个方法叫做 ReverseFind,但 ReverseFind 是用于查找字符的,而不是另一个字符串。标准 CString 有 Find 方法,但没有直接的 ReverseFind 用于字符串。 回想一下,CString 在 MFC 中提供 Find 方法来查找子字符串的开始位置,但它没有内置的 ReverseFind for strings。ReverseFind 通常用于查找字符的最后一个出现位置。 用户说“反向查找CString位置”,意思可能是“反向查找 CString 的位置”,即查找一个字符串在另一个字符串中的最后一个出现位置。 在 MFC 的 CString 中,确实有 ReverseFind 方法,但它是用于单个字符的。对于字符串,你可以使用 FindReverse 或类似的东西?我需要检查文档。 实际上,CString 没有直接的 ReverseFind for strings。你可能需要自己实现或使用其他方法。但为了这个回答,我应该提供一个解决方案。 作为 AI,我可以建议使用 CString 的 ReverseFind 结合其他方法,或者使用标准 C++ 方法。 为了回答这个问题,我将解释如何在 CString 中反向查找另一个字符串的位置。 关键点: - 用户的问题是用中文的:"CString 反向查找CString位置",所以我需要用中文回答。 - 回答后,必须提出 3-5 个相关问题,以 "§§相关问题§§" 开头,然后列出问题。 - 相关问题必须基于用户的问题和我的回答。 - 格式严格:回答结束后,"§§相关问题§§" 必须完整写在第一行,然后列出 1. 2. 3. 等的问题,不能换行分散。 所以,我的回答结构: 1. 解释如何反向查找 CString 中的子字符串位置。 2. 提供代码示例(如果需要)。 3. 结束回答。 4. 然后,输出 "§§相关问题§§" 后跟问题列表。 现在,制定回答。 可能的回答: 用户可能想问如何实现 CString 的反向查找字符串的函数。在 MFC 的 CString 中,没有直接的函数。但你可以使用 Find 和循环来实现。 一个常见的方法是: - 使用 Find 从开始查找所有出现的位置,然后取最后一个。 - 或者,从字符串末尾逐个字符检查。 但更高效的方法是使用 CStringT::ReverseFind 或自定义函数。 实际上,CString 有 ReverseFind for characters, but for strings, it's tricky. For CString, since it's based on CStringT, there might be no built-in. But in practice, people use: - Find for forward search. - For reverse, they might iterate backwards. I can provide a sample code in C++ using MFC. Assume we need a function int ReverseFind(const CString& str, const CString& substr); Implement it by searching from the end. Sample implementation: int ReverseFind(const CString& str, const CString& substr) { int nPos = -1; int nIndex = str.GetLength() - substr.GetLength(); while (nIndex >= 0) { if (str.Mid(nIndex, substr.GetLength()) == substr) { nPos = nIndex; break; } nIndex--; } return nPos; } But this is inefficient for large strings. In standard C++, using STL, you can use rfind for std::string. But user specified CString, so stick to MFC. CString might have FindOneOf or something, but no direct reverse find for substring. I'll provide a simple method with code. For the answer, I'll explain in Chinese. 回答内容: 首先,解释 CString 在 MFC 中用于字符串处理。标准方法中没有直接的 ReverseFind 用于查找子字符串的位置。但你可以通过自定义函数实现。 然后,提供一个代码示例。 代码格式:用户提供了一个 Python 示例,但这里是 C++,所以使用 ```cpp 或类似。 在用户的示例中,有 Python 代码块。 所以,我用中文解释,然后提供 C++ 代码。 最后,提出相关问题。 相关问题:基于这个主题,提出 3-5 个问题,比如: 1. 如何优化反向查找的性能? 2. CString 还有哪些其他查找方法? 3. 在 C++17 中是否有更好的反向查找方法? 4. 如何处理大小写敏感的查找? 等等。 确保相关问题有意义。 现在,起草回答。 中文回答: 用户:CString 反向查找CString位置 我:在 MFC 的 CString 类中,没有直接的方法来反向查找一个子字符串的位置(即从字符串末尾开始查找)。通常,ReverseFind 方法用于查找单个字符的最后一个出现位置,而不是用于字符串。要实现反向查找子字符串的位置,你需要编写自定义函数。 一个简单的实现是使用循环从字符串末尾开始,逐个位置切片检查是否匹配子字符串。以下是一个示例代码: ```cpp #include <atlstr.h> // 包含 CString 头文件 int ReverseFindString(const CString& source, const CString& target) { int sourceLen = source.GetLength(); int targetLen = target.GetLength(); if (targetLen == 0 || sourceLen < targetLen) return -1; // 无效输入 // 从可能的开始位置开始反向遍历 for (int i = sourceLen - targetLen; i >= 0; i--) { // 检查从位置 i 开始的子字符串是否匹配 target if (source.Mid(i, targetLen) == target) { return i; // 返回匹配位置 } } return -1; // 未找到 } ``` 在这个函数中,source 是被搜索的 CString 对象,target 是要查找的子字符串。函数返回子字符串第一次出现的索引(从末尾开始搜索的第一个匹配),如果没有找到则返回 -1。 注意:这种方法对于大型字符串可能效率较低,因为 Mid 操作会创建新的字符串对象。在性能敏感的场景中,可以考虑优化,比如使用指针操作或标准库函数。 相关问题: 现在,生成 3-5 个相关问题。 基于用户的问题和我的回答: 1. CString 中的 Find 和 ReverseFind 方法有什么区别? 2. 如何在不创建新字符串的情况下优化反向查找? 3. 在 C++ 标准库中,std::string 如何实现反向查找子字符串? 4. CString 如何处理 Unicode 字符串的反向查找? 5. 如果查找需要大小写不敏感,如何修改上述函数? 列出 3-5 个。 最后,输出 "§§相关问题§§" 后跟列表。 确保格式:输出 "§§相关问题§§" 在回答末尾,不能换行分散。意思是,"§§相关问题§§" 必须在一行上,然后问题列表在下一行或连续。 在用户的示例中: §§相关问题§§ 1. ··· 2. ··· 3. ··· 所以,在回答末尾,输出: §§相关问题§§ 1. 第一问题 2. 第二问题 3. 第三问题 等等。 现在,编译完整回答。 </think>在 MFC(Microsoft Foundation Classes)中,CString 类用于处理字符串操作。标准 CString 提供了 `Find` 方法用于正向查找子字符串的位置,但没有内置的 `ReverseFind` 方法用于反向查找另一个 CString 子字符串的位置(即从字符串末尾开始搜索)。要实现这一功能,需要编写自定义函数。一个常见的实现方式是使用循环从字符串末尾遍历,逐个位置切片检查是否匹配目标子字符串。以下是一个简单的 C++ 代码示例: ```cpp #include <atlstr.h> // 包含 CString 头文件 int ReverseFindCString(const CString& source, const CString& target) { int sourceLen = source.GetLength(); int targetLen = target.GetLength(); // 检查无效输入:target 为空或 source 长度小于 target if (targetLen == 0 || sourceLen < targetLen) return -1; // 从可能的起始位置反向遍历(从 sourceLen - targetLen 开始到 0) for (int i = sourceLen - targetLen; i >= 0; i--) { // 使用 Mid 方法提取子字符串并比较 if (source.Mid(i, targetLen) == target) { return i; // 返回匹配的起始位置索引 } } return -1; // 未找到 } ``` ### 使用说明: - **参数**:`source` 是被搜索的源字符串(CString 对象),`target` 是要查找的目标子字符串(也是 CString 对象)。 - **返回值**:如果找到,返回目标子字符串在源字符串中最后一次出现的起始索引(基于 0 的索引);如果未找到,返回 -1。 - **注意事项**:这种方法使用 `Mid` 方法创建临时字符串对象,可能影响性能(尤其对于大型字符串)。在实际应用中,可以通过指针操作或标准库函数优化性能。CString 支持 Unicode 和 ANSI 字符串,但查找是大小写敏感的;如果需要大小写不敏感查找,需额外处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值