字符串分割的几种方法

2023-10-31

方法一: 利用STL自己实现split 函数(常用,简单,直观)

原型: vector<string> split(const string &s, const string &seperator);

输入一个字符串,一个分隔符字符串(可包含多个分隔符),返回一个字符串向量。这是我最喜欢的方法,因为它最直观,在平常也最常用。实现及测试代码如下

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


vector<string> split(const string &s, const string &seperator){
  vector<string> result;
  typedef string::size_type string_size;
  string_size i = 0;
  
  while(i != s.size()){
    //找到字符串中首个不等于分隔符的字母;
    int flag = 0;
    while(i != s.size() && flag == 0){
      flag = 1;
      for(string_size x = 0; x < seperator.size(); ++x)
      if(s[i] == seperator[x]){
        ++i;
        flag = 0;
        break;
      }
    }
    
    //找到又一个分隔符,将两个分隔符之间的字符串取出;
    flag = 0;
    string_size j = i;
    while(j != s.size() && flag == 0){
      for(string_size x = 0; x < seperator.size(); ++x)
      if(s[j] == seperator[x]){
        flag = 1;
        break;
      }
      if(flag == 0) 
      ++j;
    }
    if(i != j){
      result.push_back(s.substr(i, j-i));
      i = j;
    }
  }
  return result;
}


int main(){
  string s = "a,b*c*d,e";
  vector<string> v = split(s, ",*"); //可按多个字符来分隔;
  for(vector<string>::size_type i = 0; i != v.size(); ++i)
    cout << v[i] << " ";
  cout << endl;
  //输出: a b c d
}


@egmkang 提供了一段更简洁高效的代码,实现如下:

void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
  std::string::size_type pos1, pos2;
  pos2 = s.find(c);
  pos1 = 0;
  while(std::string::npos != pos2)
  {
    v.push_back(s.substr(pos1, pos2-pos1));
 
    pos1 = pos2 + c.size();
    pos2 = s.find(c, pos1);
  }
  if(pos1 != s.length())
    v.push_back(s.substr(pos1));
}


方法二: 用C语言中的strtok 函数来进行分割

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

strtok函数包含在头文件<string.h>中,对于字符数组可以采用这种方法处理。当然也可以将字符数组转换成字符串之后再使用法一。测试代码如下

#include <string.h>
#include <stdio.h>


int main(){
  char s[] = "a,b*c,d";
  const char *sep = ",*"; //可按多个字符来分割
  char *p;
  p = strtok(s, sep);
  while(p){
    printf("%s ", p);
    p = strtok(NULL, sep);
  }
  printf("\n");
  return 0;
}
//输出: a b c d

方法三: boost库中包含了split 函数

boost库有很多方法来实现split,也包含了一个split函数,可以直接使用,非常实用而且强大但是得自己下载boost库。使用代码如下

#include <boost/algorithm/string.hpp>
#include <iostream>
#include <string>
#include <vector>


using namespace std;
using namespace boost;


void print( vector <string> & v )
{
  for (size_t n = 0; n < v.size(); n++)
    cout << "\"" << v[ n ] << "\"\n";
  cout << endl;
}


int main()
{
  string s = "a,b, c ,,e,f,";
  vector <string> fields;


  cout << "Original = \"" << s << "\"\n\n";


  cout << "Split on \',\' only\n";
  split( fields, s, is_any_of( "," ) );
  print( fields );


  cout << "Split on \" ,\"\n";
  split( fields, s, is_any_of( " ," ) );
  print( fields );


  cout << "Split on \" ,\" and elide delimiters\n"; 
  split( fields, s, is_any_of( " ," ), token_compress_on );
  print( fields );


  return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串分割的几种方法 的相关文章

  • Dynamics CRM环境还原

    Dynamics CRM 组织还原 一 还原数据库 二 导入组织 一 还原数据库 备份好 bat文件 切记 如果在同一台服务器上还原一个数据库 一定要修改目标数据库的名字 默认还原的名字会和原来的备份的数据库名字一样 二 导入组织 把姓名的
  • UGUI防止点击穿透

    if IsPointerOverGameObject Input mousePosition public static bool IsPointerOverGameObject Vector2 screenPosition 实例化点击事件
  • python实现非正态分布转正态分布(BoxCox转换)

    功能 将一维非正态分布数据转化为正态分布 输入 xlsx文件含有 患者密度 人 10万人 一列 输出 将 患者密度 人 10万人 一列转换为正态分布 并输出 实现代码 import pandas as pd import numpy as
  • DeeplabV3+网络结构搭建

    整体结构图 超详细结构图 Mobilenetv2主干 主干网络搭建 import math import os import torch import torch nn as nn import torch utils model zoo
  • 测试日常工作中需要具备哪些知识和能力,在需求评审时需要考虑哪些方面,在技术方面评审时需要考虑哪些方面,从什么方面进行设计测试用例

    前几天同事分享了一波作为测试需要具备哪些能力 测试用例需要从哪些方面进行设计 我把他分享的内容拷贝了一波 作为以后在测试过程中的参考 首先需求评审 技术方案评审 测试用例评审三者的关系 一开始 我每次设计测试用例都是从需求着手 去用测试用例
  • SQL在Excel中的应用方法

    iamlaosong文 Excel中使用SQL的主要目的是连接数据库 或Excel工作表 导入数据或者对这些数据进行统计汇总 要达到这个目的 需要好好学习SQL语句的使用 本文主要说明在Excel中如何使用SQL 至于SQL语句本身就不多作
  • 简单上手element-ui,三分钟学会按需导入~

    前言 element ui是由 饿了吗 团队开发的一个基于Vue框架的组件库 它提供了很多方便的api接口 可以快速的开发通用的页面 呸 讲这些没用的东西干嘛 下面我们就简单的讲讲 怎么快速的上手使用 ps 由于现在vue3已经成为新版本趋
  • 【大模型】长度 32K 上下文的 ChatGLM2-6B-32K 来了,开源可商用

    大模型 长度 32K 上下文的 ChatGLM2 6B 32K 来了 开源可商用 简介 ChatGLM2 6B 32K ChatGLM2 6B 32K 新特性 环境配置 环境搭建 安装依赖 代码及模型权重拉取 拉取 ChatGLM2 6B
  • 用递归求各位数字之和 C++实现

    输入一个数字 求其个十百千万 等各数字之和 要求 编写递归函数 输入 12345 输出 15 适用于初学者理解递归函数 include
  • 介绍Node.js与JavaScript

    1 Node js是JavaScript运行的环境 JavaScript是一门编程语言 2 Node js的特点 单线程 不为用户连接创建一个新的线程 而仅仅使用一个线程 当有用户连接了 就触发一个内部事件 通过非阻塞i o 事件驱动机制
  • 软件设计师上午题——第五章 知识产权

    软件设计师备考 知识产权 一 著作权 1 知识产权基础知识 2 计算机软件著作权 3 职务作品 4 委托开发 5 计算机软件著作权侵权 二 商业秘密权 1 计算机软件的商业秘密权 三 专利权 1 专利权申请 四 商标权 1 商标注册 五 杂
  • Ubuntu中ufw命令的使用

    目录 简介 一 ufw服务 1 1 检查ufw服务状态 1 2 开启ufw服务 1 3 关闭ufw服务 1 4 禁用ufw服务 1 5 启用ufw服务 二 ufw相关命令 2 1 检查ufw状态 2 2 开启ufw 2 3 关闭ufw 2
  • xss绕过尖括号和双括号_xss防御及绕过-小记1

    XSS搞安全的应该都很熟悉 本次并不是说其原理 仅是分享下在测试过程中遇到的案例 本人小白一枚 所以案例大佬们看着可能非常简单 就当是记录下自己笔记吧 不喜勿喷哈 关于xss的防御 基本上都是采用输入过滤 输出编码 最近做的一个项目中的某个
  • 数据分析-学术前沿趋势分析三

    数据分析 学术前沿趋势分析三 简介 数据处理 正则表达式 具体代码实现以及讲解 简介 该博客将继续对论文进行分析 这次是论文代码统计 统计所有论文出现代码的相关统计 使用正则表达式统计代码连接 数和图表数据 数据处理 正则表达式 在进行数据
  • impala高级设置之BROADCAST_BYTES_LIMIT

    官网地址 https impala apache org docs build html topics impala broadcast bytes limit html Sets the limit for the size of the
  • Linux怎么查看group

    2023年9月20日 周三晚上 目录 查看group的命令 我输入命令后得到的group信息 怎么看这些信息 查看group的命令 cat etc group 我输入命令后得到的group信息 root x 0 daemon x 1 bin
  • 【LLM】如何使用单个GPU 微调 Llama2

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 千兆以太网芯片88E1111 RGMII模式的驱动

    88E1111可工作在10Mb s 100Mb s 1000Mb s下 由于DE2 115开发板在设计的时候只采用了4位数据端口 因此只能采用MII模式 100Mb s 或者RGMII模式 1000Mb s 看了官方的DATASHEET后
  • python是一种面向什么的高级语言

    python是一种面向什么的高级语言 Python是一种面相对象 解释型的计算机程序语言 并已成为学习数据科学 虚拟现实和人工智能的首选编程语言 其设计哲学是 优雅 明确 简单 易上手 及时反馈的特点成了很多入门编程世界的首选 同时Pyth

随机推荐

  • git国内镜像源(64位)

    点此前往
  • Android Studio : cmdline-tools component is missing. Android license status unknown.

    运行flutter doctor报错 D AndroidStudio projectLocations gt flutter doctor Doctor summary to see all details run flutter doct
  • Caused by: java.lang.IllegalStateException: Logback configuration error detected:

    项目场景 今天像往常一样打了个jar包 在本地是可以运行的 放测试环境上就不能运行了 整了半小时才看明白 以后一定要认识看报错信息 问题描述 在本地测试可以运行 在测试环境报 Caused by java lang IllegalState
  • 【自学C++】C++ short

    C short C short教程 C 中的 short 用来表示一个 整数 也可以叫做短整型 如果我们需要表示的整数比较小 那么我们可以使用 short 来定义 这样可以节省系统资源 C short定义详解 语法 short int va
  • python学习-面向对象进阶之闭包(八)

    闭包 1 函数引用 def test1 print in test1 func 调用函数 test1 引用函数 ret test1 print id ret print id test1 通过引用调用函数 ret 运行结果 in test1
  • 第19章 通信-模拟I2C

    一 关于I2C 1 1 I2C协议 I C Inter Integrated Circuit 常读作 I方C 它是一种多主从架构串行通信总线 在1980年由飞利浦公司设计 用于让主板 嵌入式系统或手机连接低速周边设备 I C由两条线组成 一
  • JAVA开发(外部接口调用授权问题记录总结)

    一 技术背景 现在很多web项目或者小程序在上线后都需要进行交叉引流 交叉业务合作 数据传输 与其他的企业 网站 app合作 那么就需要接口数据调用 那么在做外部系统接口调用和自己开发的微服务间的接口调用显然是不同的 最明显的特征就是 系统
  • Simple_SSTI_1与Simple_SSTI_2

    目录 一 Simple SSTI 1 二 Simple SSTI 2 一 Simple SSTI 1 首先打开场景 然后F12查看一下源码 于是通过百度相关知识寻找线索 1 SSTI 服务器端模版注入是指攻击者能够使用本机模板语法将恶意有效
  • BES2500/BES2300 学习笔记目录

    交流学习 如有错误欢迎指正 by wwdeng QQ 435398366 BES2500 BES2300 学习笔记目录 开发环境 代码编辑器 vscode Source Insight 编译 Windows Linux 调试 Trace 工
  • HTML5知识点总结

    1 什么是 HTML5 1 1 HTML版本 1 2 HTML5简介 万维网的核心语言 标准通用标记语言下的一个应用超文本标记语言 HTML 的第五次重大修改 用于取代HTML4与 XHTML的新一代标准版本 所以叫HTML5 XHTML
  • Spring-Resource接口

    4 1 1 概述 在日常程序开发中 处理外部资源是很繁琐的事情 我们可能需要处理URL资源 File资源资源 ClassPath相关资源 服务器相关资源 JBoss AS 5 x上的VFS资源 等等很多资源 因此处理这些资源需要使用不同的接
  • 【云原生之kubernetes】k8s集群的日常基本操作

    云原生之kubernetes k8s集群的日常基本操作 一 查看集群的状态 1 1 查看集群的节点 1 2 查看节点的详细状态 1 3 查看当前集群的pod 1 4 查看pod的详细信息 1 5 查看集群的所有pods 1 6 查看depo
  • 从贝叶斯方法谈到贝叶斯网络

    从贝叶斯方法谈到贝叶斯网络 0 引言 事实上 介绍贝叶斯定理 贝叶斯方法 贝叶斯推断的资料 书籍不少 比如 数理统计学简史 以及 统计决策论及贝叶斯分析 James O Berger著 等等 然介绍贝叶斯网络的中文资料则非常少 中文书籍总共
  • java设计学生类

    设计一个学生类 1 Student类中包含姓名 成绩两个属性 2分别给这两个属性定义两个方法 一个方法用于设置值 另一个方法用于获取值 3 Student类中定义一个无参的构造方法和一个接收两个参数的构造方法 两个参数分别为姓名和成绩属性赋
  • 制作Python,Raspberry Pi,电机和传感器版无线控制漫游车

    构建功能强大且可升级的个人机器人 您将学习如何控制伺服系统 响应传感器输入以及了解您的机器人在何处使用 GPS 您还将学习多种连接机器人并向其发送指令的方法 从 SSH 连接到从手机发送短信 内容 Raspberry Pi 介绍 Linux
  • 数字信息记忆-八大行星

    1 八大行星 水星 金星 地球 火星 木星 土星 天王星 海王星 2 提取关键字 水金球火木土天海 3 谐音联结 水晶 金 球喷火 烧木成土 从天落到海里
  • SQL语句基础练习(表的创建,基础查询)-提供建表语句和查询题目与解答

    说明 此基础练习的题目难度都比较简单 但是还有一些细节需要把握 此题目的主要目的是熟悉SQL语句的基础查询 关于建表方面的语句了解即可 因为一般开发中所用的都是图形化建表 SQL语句建表所用较少 虽然这些题目比较简单 但是开始中大多数都是这
  • Montery 无法接收12.1更新问题的处理

    Monterey 无法接收12 1更新问题的处理 说干货 打开App Store 搜索Monterey 点击macOS Monterey上的 查看 或者 获取 如果进度条卡住 重启系统再试
  • java zip压缩文件中文文件名乱码

    使用java util zipoutputstream发现中文名出现乱码 一直试着使用new String filename getBytes GBK ISO 8859 1 还是无效 后来查阅资料 java util zipoutputst
  • 字符串分割的几种方法

    方法一 利用STL自己实现split 函数 常用 简单 直观 原型 vector