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

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

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

(0)
上一篇 2022年4月29日 上午9:33
下一篇 2022年4月29日 上午9:33


相关推荐

  • 从零到一:基于DeepSeek构建AI Agent智能体的全流程指南

    从零到一:基于DeepSeek构建AI Agent智能体的全流程指南

    2026年3月16日
    5
  • 解析Java框架中entity层,mapper层,service层,controller各层作用

    解析Java框架中entity层,mapper层,service层,controller各层作用一 entity 层别名 model 层 domain 层用途 用于存放我们的实体类 与数据库中的属性值基本保持一致 实现 set 和 get 的方法 例子 user 表的实体 userpubliccl 用户 id Id GeneratedVal strategy GenerationTy IDENTIT

    2026年3月18日
    1
  • linux下查看已经安装的jdk 并卸载jdk的方法

    linux下查看已经安装的jdk 并卸载jdk的方法linux下查看已经安装的jdk并卸载jdk的方法学习路径linux下查看已经安装的jdk并卸载jdk的方法一、查看Jdk的安装路径:二、卸载旧版本的JDK:三、安装JDK(以JDK1.8为例子)1、yum一键安装2、手动安装(推荐)一、查看Jdk的安装路径:whereisjavawhichjava(java执行路径)echo$JAVA_HOMEecho$PATH备注:如果是windows中,可以使用:setjava_home:查看JDK安装路径java-version:

    2022年6月25日
    35
  • idea热部署且开启自动编译「建议收藏」

    idea热部署且开启自动编译「建议收藏」最近调试代码需要起服务并修改代码这就导致重复工作,目前是修改服务器配置,即当idea失去焦点时更新类和资源,但是这种只支持在debug模式且是在idea失去焦点才会触发热部署,这就相对加载的慢了。此法的配置方法:Run–&gt;EditConfigguration如果你sever选项卡下没有Onframedeactivation,那么就需要配置Deployment选项…

    2022年6月12日
    117
  • STM32开发笔记37: 485总线的收发切换时间_STM32库开发实战指南:基于STM32F4

    STM32开发笔记37: 485总线的收发切换时间_STM32库开发实战指南:基于STM32F4架构图带位操作原理以往我们在使用暂存器时,都是在操作该暂存器32bits(4bytes)的储存地址,要对其中单一bit进行操作,可以仰赖bitoperation来完成。而bit-banding(位带操作)的目的就是实现直接操作单一比特位为了达成这个目的首先我们有必要理解STM32的特殊存储区段位带区与位带别名区。下图中的红色方框代表位带区的范围,可以看到SRAM中位带区佔有1MB,外设区段部分,1MB的储存范围刚好涵盖了AHB,APB1,APB2,可以说我们使用的大部分外设,例如GPIO,

    2022年10月13日
    3
  • 微信地位,牢不可破?

    微信地位,牢不可破?作者|李楠本文经授权转自新浪科技QQ与微信接连称霸社交赛道20年后,新的临界点似乎已经到来。回看2019的社交市场,新产品持续推出。截至目前,阿里巴巴、字节跳动、百度、京东、网易、搜狐等新老巨头纷纷入局,映客8500万美元收购积目引起热议,以“灵魂”做标签的Soul崭露头角。有专家向新浪科技表示,00后群体正在崛起,其对社交网络的需求有所差别,这群主力军不一定热衷于微…

    2022年5月14日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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