C++ string字符串按分隔符分割成一個數組(轉)


#include<iostream>  
#include<string>  
#include<vector>  


using namespace std;  


//splitString函數的參數說明:  
//返回值是分割后字符串數組大小  
//strSrc 原始字符串  
//strDelims 自定義的分割字符串的分割數組  
//strDest 分割后的字符串數組,引用傳遞  


int  splitString(const string & strSrc, const std::string& strDelims, vector<string>& strDest)  
{  
typedef std::string::size_type ST;  
string delims = strDelims;  
std::string STR;  
if(delims.empty()) delims = "/n/r";  


ST pos=0, LEN = strSrc.size();  
while(pos < LEN ){  
STR="";   
while( (delims.find(strSrc[pos]) != std::string::npos) && (pos < LEN) ) ++pos;  
if(pos==LEN) return strDest.size();  
while( (delims.find(strSrc[pos]) == std::string::npos) && (pos < LEN) ) STR += strSrc[pos++];  
//std::cout << "[" << STR << "]";  
if( ! STR.empty() ) strDest.push_back(STR);  
}  
return strDest.size();  
}  


int main()  
{  
string testStr = "提供關於_開發業 界,軟件業界,-移動業界,雲計算業界的權威報道,為業界產 品經理,業界開發 者,";  
string delims = ",- _ ,,"; //定義分割數組,可以定義多個分隔符,如" ,./r"等  
vector<string> splitStrs; //把分割后的字符串存在vector里面  
splitString(testStr,delims, splitStrs); //調用自定義的分割函數  


//顯示分割后的字符串數組(用vector存儲)  
vector<string>::iterator iter;  
for (iter = splitStrs.begin(); iter != splitStrs.end(); ++iter) {  
cout << "|" << *iter << "|/n";  
}  


splitStrs.clear();  

https://blog.csdn.net/liuyinghui523/article/details/40082437

 

C++的string類型可以很方便的操作字符串,但是在使用中發現不支持Split,為了滿足使用的需要,我自己寫了一個分割函數。

  1.  
    #include <string>
  2.  
    #include <vector>
  3.  
    using std::string; //使用string對象
  4.  
    using std::vector; //使用vector
  5.  
     
  6.  
     
  7.  
     
  8.  
    void Split(const std::string& src, const std::string& separator, std::vector<std::string>& dest);//函數原型
  9.  
     
  10.  
     
  11.  
    void Split(const std::string& src, const std::string& separator, std::vector<std::string>& dest) //字符串分割到數組
  12.  
    {
  13.  
     
  14.  
    //參數1:要分割的字符串;參數2:作為分隔符的字符;參數3:存放分割后的字符串的vector向量
  15.  
     
  16.  
    string str = src;
  17.  
    string substring;
  18.  
    string::size_type start = 0, index;
  19.  
    dest.clear();
  20.  
    index = str.find_first_of(separator,start);
  21.  
    do
  22.  
    {
  23.  
    if (index != string::npos)
  24.  
    {
  25.  
    substring = str.substr(start,index-start );
  26.  
    dest.push_back(substring);
  27.  
    start =index+separator.size();
  28.  
    index = str.find(separator,start);
  29.  
    if (start == string::npos) break;
  30.  
    }
  31.  
    } while(index != string::npos);
  32.  
     
  33.  
    //the last part
  34.  
    substring = str.substr(start);
  35.  
    dest.push_back(substring);
  36.  
    }

測試:

  1.  
    vector<string> ster;
  2.  
    vector<string>::iterator iter; //聲明一個迭代器
  3.  
    string girl="春哥|胯下神駒";
  4.  
    string Insta;
  5.  
    CString pourin;
  6.  
     
  7.  
    Split(girl, "|",ster);
  8.  
     
  9.  
    for (iter=ster.begin();iter!=ster.end();iter++)
  10.  
    {
  11.  
     
  12.  
     
  13.  
    Insta=*iter;
  14.  
    pourin=toCString(Insta); //自定義的把string轉為CString的函數
  15.  
     
  16.  
    OutputDebugString(pourin+ L"\n");//調試輸出
  17.  
     
  18.  
    }

 

string類型替換字符串函數:

 

string類型的默認替換字符串函數需要使用者給出需要替換的字節數,以及替換多少次,非常詳細,但是用起來也非常麻煩,故而在網上找到一個一次性替換所有待替換字符串的函數。
 

  1.  
    void StringReplace(std::string &strBase, std::string strSrc, std::string strDes);
  2.  
     
  3.  
     
  4.  
    void StringReplace(string &strBase, string strSrc, string strDes)
  5.  
    {
  6.  
    //參數1:待修改的字符串;參數2:要替換的內容;參數3:替換后的內容,比如把AA替換成BB,這里要填的是BB
  7.  
    //替換完后會返回給原字符串變量也就是strBase。
  8.  
    string::size_type pos = 0;
  9.  
    string::size_type srcLen = strSrc.size();
  10.  
    string::size_type desLen = strDes.size();
  11.  
    pos=strBase.find(strSrc, pos);
  12.  
    while ((pos != string::npos))
  13.  
    {
  14.  
    strBase.replace(pos, srcLen, strDes);
  15.  
    pos=strBase.find(strSrc, (pos+desLen));
  16.  
    }
  17.  
    }

 

LPCTSTR不是一個類型,而是兩種類型:LPCSTR和LPCWSTR其中之一。會根據你當前程序是否使用UNICODE字符集來變成那二者之一。如果使用UNICODE字符集,則LPCTSTR = LPCWSTR,否則LPCTSTR = LPCSTR。

標准庫的std::string轉換成LPCSTR很簡單:直接調用c_str()即可。例:

std::string a="abc";

LPCSTR str = a.c_str();

標准庫還有一個wstring,代表寬字符的string,std::wstring轉換成LPCWSTR也一樣很簡單:

std::wstring a = L"abc";

LPCWSTR str = a.c_str();

如果要是std::string轉換成LPCWSTR或者std::wstring轉換成LPCSTR那就比較麻煩了,需要調用MultiByteToWideChar或WideCharToMultiByte進行 字符集之間的轉換。不過大多數時候不需要這種交叉轉換,一個程序一般只會使用一種字符集。

 

C++或MFC中關於轉義字符的處理

 

D:\XKey\XKey.exe

比如上面這個地址,按照C++編譯器的標准"\"屬於轉義符,需要替換成"\\"來表示,但這只是在C++的源碼中需要這樣表示,如果用API讀取文本中的地址,編譯后\就還是\不需要再替換成\\。

也就是說只有在代碼中寫的"D:\\XKey\\XKey.exe"這種地方才會有轉義字符,真正程序編譯完畢之后就不存在轉義的問題了。程序編譯完畢之后,上面的字符串就變為了C:\1.txt。另外在VC++中也可以用"/"替代"\\"來表示目錄層次,比如"D:/XKey/XKey.exe"也是可以編譯通過正常使用的,此時就不需要把"/"改成"//"了。

 

string字符串轉char*

    1.  
      void Brow(string diffe)//string字符串轉char*
    2.  
      {
    3.  
       
    4.  
       
    5.  
      int num = strlen(diffe.c_str()) +1;//c_str()返回字符串首字符地址;strlen()從第一個字符開始往后統計直到遇到結束符\0,返回數到的字符數,但不包含\0.
    6.  
      //統計string字符串的長度
    7.  
       
    8.  
      char* strchar1 = new char[num]; //動態創建一個字符數組,並返回地址給char* 指針;根據string字符串的長度動態申請相應的字節數組
    9.  
      memcpy(strchar1, diffe.c_str(), num); //從參數2中把字節拷貝到參數1中,拷貝多少個字節由參數3指定
    10.  
       
    11.  
      if (strchar1!=NULL) //只要strchar1指針不為空用完后就釋放掉內存
    12.  
      {
    13.  
      delete []strchar1;
    14.  
      strchar1 = NULL;
    15.  
      }
    16.  
       
    17.  
       
    18.  
       
    19.  
      }
  1. https://blog.csdn.net/l198738655/article/details/81356915


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM