C++如何做字符串分割(5种方法)

C++如何做字符串分割(5种方法)1、用strtok函数进行字符串分割原型:char*strtok(char*str,constchar*delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include<string.h>#include<stdio.h&

大家好,又见面了,我是你们的朋友全栈君。

1、用strtok函数进行字符串分割

原型: char *strtok(char *str, const char *delim);

功能:分解字符串为一组字符串。

参数说明:str为要分解的字符串,delim为分隔符字符串。

返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。

其它:strtok函数线程不安全,可以使用strtok_r替代。

示例:

//借助strtok实现split
#include <string.h>
#include <stdio.h>
 
int main()
{ 
   
    char s[] = "Golden Global View,disk * desk";
    const char *d = " ,*";
    char *p;
    p = strtok(s,d);
    while(p)
    { 
   
        printf("%s\n",p);
        p=strtok(NULL,d);
    }
 
    return 0;
}

2、substr函数

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

#include <iostream>
#include <string>
#include <vector>
//字符串分割函数
std::vector<std::string> split(std::string str, std::string pattern)
{ 
   
    std::string::size_type pos;
    std::vector<std::string> result;
    str += pattern;//扩展字符串以方便操作
    int size = str.size();
    for (int i = 0; i < size; i++)
    { 
   
        pos = str.find(pattern, i);
        if (pos < size)
        { 
   
            std::string s = str.substr(i, pos - i);
            result.push_back(s);
            i = pos + pattern.size() - 1;
        }
    }
    return result;
}

示例:

int main()

{ 
   
  std::string str;
  std::cout<<"Please input str:"<<std::endl;
  //std::cin>>str;
  getline(std::cin,str);
  std::string pattern;
  std::cout<<"Please input pattern:"<<std::endl;
  //std::cin>>pattern;
  getline(std::cin,pattern);//用于获取含空格的字符串
  std::vector<std::string> result=split(str,pattern);
  std::cout<<"The result:"<<std::endl;
  for(int i=0; i<result.size(); i++)
  { 
   
    std::cout<<result[i]<<std::endl;
  }
 
  std::cin.get();
  std::cin.get();
  return 0;
}

3、find_first_not_of

#include<string>
#include<vector>
#include<iostream>
using namespace std;

void Tokenize(const string& str, vector<string>& tokens, const string& delimiters)
{ 
   
  // Skip delimiters at beginning.
  string::size_type lastPos = str.find_first_not_of(delimiters, 0);
  // Find first "non-delimiter".
  string::size_type pos     = str.find_first_of(delimiters, lastPos);
  while (string::npos != pos || string::npos != lastPos)
  { 
   
    // Found a token, add it to the vector.
    tokens.push_back(str.substr(lastPos, pos - lastPos));
    // Skip delimiters. Note the "not_of"
    lastPos = str.find_first_not_of(delimiters, pos);
    // Find next "non-delimiter"
    pos = str.find_first_of(delimiters, lastPos);
  }
}

int main(int argc, char *argv[])
{ 
   
  string str("====aaa==bbb=ccc=ddd====");
  vector<string>tokens;
  Tokenize(str, tokens, "=");
  for( int i = 0; i < tokens.size() ; i++ )
  { 
   
    cout << tokens[i] << endl;
  }
  return 0;
}

4、用Boost进行字符串的分割

用boost库的正则表达式实现字符串分割

#include <iostream>
#include <cassert>
#include <vector>
#include <string>
#include "boost/regex.hpp"
 
std::vector<std::string> split(std::string str,std::string s)
{ 
   
    boost::regex reg(s.c_str());
    std::vector<std::string> vec;
    boost::sregex_token_iterator it(str.begin(),str.end(),reg,-1);
    boost::sregex_token_iterator end;
    while(it!=end)
    { 
   
        vec.push_back(*it++);
    }
    return vec;
}

int main()
{ 
   
    std::string str,s;
    str="sss/ddd/ggg/hh";
    s="/";
    std::vector<std::string> vec=split(str,s);
    for(int i=0,size=vec.size();i<size;i++)
    { 
   
        std::cout<<vec[i]<<std::endl;
    }
    std::cin.get();
    std::cin.get();
    return 0;
}

5、最近发现boost里面有自带的split的函数

如果用boost的话,还是直接用split的好,代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
using namespace std;

int main()
{ 
   
  string s = "sss/ddd,ggg";
  vector<string> vStr;
  boost::split( vStr, s, boost::is_any_of( ",/" ), boost::token_compress_on );
  for( vector<string>::iterator it = vStr.begin(); it != vStr.end(); ++ it )
  { 
   
    cout << *it << endl;
  }
  return 0;
}

转载自:
https://www.cnblogs.com/happykoukou/p/5427268.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130601.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 卸载pycharm重新安装_ubuntu卸载pycharm

    卸载pycharm重新安装_ubuntu卸载pycharm1.安装包下载下载地址https://www.jetbrains.com/pycharm/download/#section=linux社区版是免费的,不需要支付额外的费用,但是功能略微筛选,适合于学生群体,而专业版需要支付一定的费用,功能比较多,适用于企业,但整体的安装过程相同。2.安装在安装包过程启动终端命令,解压缩下载后的安装包修改自己的安装包版本号即可$tar-zxvfpycharm-professional-2021.3.1.tar.gz将解压缩后的目录移动到/

  • 软件管理和电脑管家打不开怎么办_电脑管家下载软件连接错误

    软件管理和电脑管家打不开怎么办_电脑管家下载软件连接错误错误:应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具”问题的处理方法。方法一:开始-运行(输入services.msc)-确定或回车,打开:服务(本地);我们在服务(本地)窗口找到:WindowsModulesInstaller服务,查看是否被禁用;3…如果WindowsModulesInstaller服务被禁用,我们必须把它更改为启用-手动,重启计算机,再安装应用程序。转载至https://blo

  • 数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

  • imread怎么读取图片_opencv读不到图片

    imread怎么读取图片_opencv读不到图片Matimage_source=imread(“D:\program\xie.png”)直接放入图片的绝对路径只需要把图像文件放在工程文件夹下和.cpp文件放在一起就行了,读取的时候就可以直接用名字读取,如imread(“miao.jpg”);src=imread(argv[1],1);方法是:工程——属性——配置属性——调试——命令行参数,然后设置就行了。argv[1…

    2022年10月14日
  • Struts2的2.5.10版本找不到StrutsPrepareAndExecuteFilter过滤器 与 struts.xml文件通配符异常问题

    Struts2的2.5.10版本找不到StrutsPrepareAndExecuteFilter过滤器 与 struts.xml文件通配符异常问题

  • JAVA中全局变量

    java中的全局变量是由public修饰的static成员变量,形如publicstaticintID;java中的全局变量是放在静态方法区中的,所有的实例对象会共享同一份全局变量。所以一旦对某个类实例化后对其中的全局变量做出修改,那么其他的实例其中的全局变量值也相应的会被修改。定义了一个测试类如下:packageTEST;publicclassClassTest{ pu…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号