VC 字符串转化和分割

来源:互联网 发布:中国乒乓球 知乎 编辑:程序博客网 时间:2024/06/08 17:29

1、格式化字符串

CString s;
s.Format(_T("The num is %d."), i);

 

2、转为 int

转10进制最好用_ttoi(),它在 ANSI 编码系统中被编译成_atoi(),而在 Unicode 编码系统中编译成_wtoi()。用_tcstoul()或者_tcstol()可以把字符串转化成任意进制的(无符号/有符号)长整数。

CString hex = _T("FAB");
CString decimal = _T("4011");
ASSERT(_tcstoul(hex, 0, 16) == _ttoi(decimal));

 

3、转为 char *

3.1 强制类型转换为 LPCTSTR,不能修改字符串

LPCTSTR p = s; 或者直接 (LPCTSTR)s;

3.2 使用 GetBuffer 方法

不给 GetBuffer 传递参数时它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。假设你想增加字符串的长度,就必须将你需要的字符空间大小(注意:是字符而不是字节,因为 CString 是以隐含方式感知 Unicode 的)传给它。当调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

LPTSTR p = s.GetBuffer();
// do something with p
int m = s.GetLength(); // 可能出错!!!
s.ReleaseBuffer();
int n = s.GetLength(); // 保证正确

 

4、分割字符串

4.1 单字符分割

AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep = '\n');

CString csFullString(_T("abcd-efg-hijk-lmn"));
CString csTemp;
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, '-'); // 得到 abcd
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 1, '-'); // 得到 efg
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 2, '-'); // 得到 hijk
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 3, '-'); // 得到 lmn

分隔符可以随便指定:
AfxExtractSubString(csTemp, (LPCTSTR)csFullString, 0, 'f'); // 得到 abcd-e

 

4.2 字符串分割

利用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 是用来做分割符的字符串


利用strtok()用来将字符串分割。

C/C++中的Split函数是strtok()其函数原型如下:
char * strtok (char * str, const char * delimiters);
函数说明
strtok()用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串,当strtok()在参数str的字符串中发现到参数delimiters的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回值
返回下一个分割后的字符串指针,如果已无从分割则返回NULL。

示例-1 /* strtok example */ #include <stdio.h> #include <string.h> int main () { char str[] ="a,b,c,d*e"; const char * split = ","; char * p; p = strtok (str,split); while(p!=NULL) { printf ("%s\n",p); p = strtok(NULL,split); } getchar(); return 0; } 

本例中,实现对字符串'a,b,c,d*e"用逗号(,)来作界定符对字符串进行分割。
输出结果将如下所示:
a
b
c
d*e
因为delimiters支持多个分割符, 我们将本示例中的语句行
const char * split = ",";
改成 const char * split = ",*"; //用逗号(,)和星号(*)对字符串进行分割
这样输出结果将如下所示:
a
b
c
d
e



用STL进行字符串的分割 


涉及到string类的两个函数find和substr:
1、find函数
原型:size_t find ( const string& str, size_t pos = 0 ) const;
功能:查找子字符串第一次出现的位置。
参数说明:str为子字符串,pos为初始查找位置。
返回值:找到的话返回第一次出现的位置,否则返回string::npos 


2、substr函数
原型:string substr ( size_t pos = 0, size_t n = npos ) const;
功能:获得子字符串。
参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos)
返回值:子字符串 


实现如下:
  1. #include <iostream>  
  2. #include <string>  
  3. #include <vector>  
  4.   
  5. //字符串分割函数  
  6. std::vector<std::string> split(std::string str,std::string pattern)  
  7. {  
  8.     std::string::size_type pos;  
  9.     std::vector<std::string> result;  
  10.     str+=pattern;//扩展字符串以方便操作  
  11.     int size=str.size();  
  12.   
  13.     for(int i=0; i<size; i++)  
  14.     {  
  15.         pos=str.find(pattern,i);  
  16.         if(pos<size)  
  17.         {  
  18.             std::string s=str.substr(i,pos-i);  
  19.             result.push_back(s);  
  20.             i=pos+pattern.size()-1;  
  21.         }  
  22.     }  
  23.     return result;  


0 0
原创粉丝点击