CString->std::string 例子: unicode情形下: CStringW strw = _T("test"); std::string imgpath=stra.GetBuffer(0); AfxExtractSubString是截取字符串的函数,很好用,不过美中不足的地方在与它只能使用单个字符作为分割符。 但是这种情况在很多时候都行不通,如果分割符需要是两个字符以上呢? 之前因为这个问题试了很久,也在网上搜索过。不过可惜的是,网上的大部分关于VC截取字符串的文章都是那么同样的几篇,都是写的满复杂然后可以实现了AfxExtractSubString功能而已的,也就是只能用单个字符截取,但是标题却写着用字符串截取字符串,好笑! 不找了,自己写吧。CString里面有Find,然后再组成数组。 void Split(CString source, CStringArray& dest, CString division)
{ dest.RemoveAll(); int pos = 0; int pre_pos = 0; while( -1 != pos ){ pre_pos = pos; pos = source.Find(division,(pos+1)); dest.Add(source.Mid(pre_pos,(pos-pre_pos))); } } CString source是需要截取的原字符串, CStringArray& dest 是最终结果的数组 CString division 是用来做分割符的字符串
备忘:为了适用于Unicode环境,要养成使用_T()宏的习惯 1、格式化字符串 CString s;
2、转为 int 转10进制最好用_ttoi(),它在 ANSI 编码系统中被编译成_atoi(),而在 Unicode 编码系统中编译成_wtoi()。用_tcstoul()或者_tcstol()可以把字符串转化成任意进制的(无符号/有符号)长整数。 CString hex = _T("FAB");
3、转为 char * 3.1 强制类型转换为 LPCTSTR,不能修改字符串 LPCTSTR p = s; 或者直接 (LPCTSTR)s; 3.2 使用 GetBuffer 方法 不给 GetBuffer 传递参数时它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。假设你想增加字符串的长度,就必须将你需要的字符空间大小(注意:是字符而不是字节,因为 CString 是以隐含方式感知 Unicode 的)传给它。当调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。 LPTSTR p = s.GetBuffer(); 4、其他 4.1 分割字符串 AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '/n'); CString csFullString(_T("abcd-efg-hijk-lmn")); 分隔符可以随便指定: |
|