当前位置: 首页 > news >正文

基于C++的一种字符串切分方法及示例代码

一、概述

在 Java 和 python 中,都有实现字符串切分的方法, 如split() ,使用起来较为方便,但是在标准的 C++ 中,却没有内置的 split() 方法。

我们可以使用标准库中的一些函数和方法来实现字符串的切分,这里主要使用到了C++ STL 中的 字符串流对象(stringstream)和 getline()函数 来实现字符串的切分。

二、stringstream 和 getline 简介

2.1 stringstream 类

stringstream 是 C++ STL 中的一个类,定义于 <sstream> 头文件中(sstream是stringstream的缩写)。通过stringstream ,可以将字符串作为输入输出流来处理(类似于 cin 和 cout 对标准输入输出流的操作,stringstream 可进行针对于字符串的输入输出操作)

示例代码如下:

#include <iostream>
#include <sstream>
using namespace std;int main() {// 创建一个 stringstream 对象 ss,并初始化其内容stringstream ss("I Love You ! ! !");// 从 ss 中逐个读取单词,输出到s,然后输出到屏幕string s;while (ss >> s) {cout << s;}cout << endl;// 清除流的状态标志,以重新定位ss.clear();// 将读取位置设置为开头,以便从头开始读取流中的内容ss.seekg(0);// 将 ss 中的内容设置为 "3 2 1",覆盖原有内容ss.str("3 2 1");// 从 ss 中逐个读取整数,并输出int t;while (ss >> t) {cout << t << " ";}cout << endl;return 0;
}

运行结果:

2.2 getline()函数

getline() 是 C++ STL  中的一个函数,用于从输入流中读取一行字符串。

该函数接受3个参数:

1. 输入流对象(istream):通常是 cin 或 文件流对象。

2. 输出字符串(string):读取的字符串将存储于该变量。

3. 分隔符(可缺省),用于指定结束符,如不指定分隔符参数,则默认为换行符 '\n' 。

示例代码如下:

#include <iostream>
#include <string>
using namespace std;
int main() {string input;cout << "please input a string" << endl;// 默认换行符为结束符getline(cin, input);cout << "input string: [ " << input << " ]" << endl;cout << "\nplease input a string again" << endl;// 指定空格作为结束符getline(cin, input, ' ');cout << "input string: [ " << input << " ]" << endl;return 0;
}

运行结果:

 

2.3 相关参考

关于字符串流对象 stringstream 的详细用法可以参考:

cplusplus.com/reference/sstream/stringstream/

关于 getline()函数 可以参考:

cplusplus.com/reference/string/string/getline/

 

三、切分方法

3.1 切分步骤

1. 创建字符串流对象,使用目标字符串(待切分的字符串)对其进行初始化。

2. 以字符串流对象为输入流对象,使用 getline() 函数,以指定的结束符为结束标志,依次读取输入的字符串。

3. 循环进行 2 ,直到结束。期间,每次都会持续读取到指定的分隔符后结束,此时可直接处理子串(或者递归对子串进行处理),以此实现对字符串的切分。

3.2 举例

"姓名:时栈,性别:男,地区:陕西,爱好:游泳"

 对于上述字符串,可以先以逗号为分隔符,对于切分下来的子串,再使用冒号作为分隔符。

 

 

四、示例代码

对于上述子串,使用上述步骤进行切分,代码如下:

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
typedef pair<string, string> PSS;// 该函数使用 delimiter 将 str 切分为键值对
// 并返回pair<string, string> 的数组
vector<PSS> split(string str, char delimiter){stringstream ss(str);string keyValueStr;vector<PSS> ret;// 从 ss 中读取数据,读取到delimiter符号为止,并将读到的内容存储到keyValueStrwhile(getline(ss, keyValueStr, delimiter)){// 使用stringstream处理keyValueStr,以提取键和值stringstream kvs(keyValueStr);string keyStr, valueStr;getline(kvs, keyStr, ':');getline(kvs, valueStr, ':');// 存储键值对到vector中ret.push_back( {keyStr, valueStr} );}return ret;
}int main(){// 待切分的字符串string str1 = "姓名:时栈,性别:男,地区:陕西,爱好:游泳";string str2 = " 日期:2024年3月14日; 农历:二月初五; 天气:多云; 星期:周四";// 根据字符串的特点进行切分vector<PSS> kv1 = split(str1, ',');vector<PSS> kv2 = split(str2, ';');// 输出kv1cout << "kv1:" << endl;for(PSS t : kv1) cout << t.first << " " << t.second << endl;// 输出kv2// 这里可以对kv2中的包含的空格进一步处理,处理过程此处省略cout << "\nkv2:" << endl;for(PSS t : kv2) cout << t.first << " " << t.second << endl;return 0;
}

运行结果:

 如有不当或错误之处,恳请您的指正,谢谢!!!

相关文章:

  • 升级版本彻底解决bootstrap-table-fixed-columns固定列后行对不齐问题
  • 滴滴 Flink 指标系统的架构设计与实践
  • 每天学习一个Linux命令之cat
  • rust开发100问?
  • antd5 虚拟列表原理(rc-virtual-list)
  • [剪藏] - 由哇哈哈和农夫山泉所想到的
  • OpenCV 图像重映射函数remap()实例详解
  • 游戏开发中的坑之十三 Lut贴图相关问题
  • 数据治理——滴滴大数据成本治理实践
  • ChromeDriver 122 版本为例 国内下载地址及安装教程
  • java零基础入门-Map遍历
  • 通过xlsx库解析读取excel表格内容
  • 现代化的轻量级Redis桌面客户端Tiny RDM
  • 加速 PyTorch 模型预测常见方法梳理
  • 《系统架构设计师教程(第2版)》第6章-据库设计基础知识-03-关系数据库设计
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • Android 架构优化~MVP 架构改造
  • CEF与代理
  • JavaScript实现分页效果
  • Linux各目录及每个目录的详细介绍
  • Material Design
  • passportjs 源码分析
  • SpringCloud集成分布式事务LCN (一)
  • underscore源码剖析之整体架构
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 测试开发系类之接口自动化测试
  • 关于springcloud Gateway中的限流
  • 关于使用markdown的方法(引自CSDN教程)
  • 前端
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 删除表内多余的重复数据
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 听说你叫Java(二)–Servlet请求
  • 我建了一个叫Hello World的项目
  • 用jquery写贪吃蛇
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​卜东波研究员:高观点下的少儿计算思维
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (day6) 319. 灯泡开关
  • (python)数据结构---字典
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)JAVA中的堆栈
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • . NET自动找可写目录
  • .Net core 6.0 升8.0
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @requestBody写与不写的情况
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ANT] 项目中应用ANT
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)