• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++string字符串按分隔符分割成一个数组(转)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

#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();  

 

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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
H3CIPSec配置实例发布时间:2022-07-13
下一篇:
C#中DataGridView的使用-[C#.NET]发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap