zoukankan      html  css  js  c++  java
  • C++ string字符串按分隔符分割成一个数组(转)

    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
  • 相关阅读:
    面试中遇到的几道逻辑题目
    [转]计算机专业人工智能方向——研究生面试需知的十大问题
    new、delete、析构函数、自动类型转换
    第三章 传输层
    年后排序+ST表+ksm+矩阵ksm+斐波那契数列矩阵ksm+归并排序
    DP斜率优化
    DP现阶段优化
    平衡树(一)——二叉搜索树
    NOIP 2017-day2
    2017 NOIP2017 day 1
  • 原文地址:https://www.cnblogs.com/xihong2014/p/15529004.html
Copyright © 2011-2022 走看看