基于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符号为止,并将读到的内容存储到keyValueStr
    
    while(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, ';');

    // 输出kv1
    cout << "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;
}

运行结果:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/454659.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【报错 - npm包问题】 token.type.endsWith is not a function

将 babel-eslint 10.1.0版本&#xff0c;降为 8.2.2 npm install babel-eslint8.2.2 --save

[云原生] Prometheus理论知识及系统搭建

promethues是一个开源的系统监控和报警系统&#xff0c;现在已经加入到CNCF基金会&#xff0c;成为继k8s之后第二个在CNCF托管的项目&#xff0c;在kubernetes容器管理系统中&#xff0c;通常会搭配prometheus进行监控&#xff0c;同时也支持多种exporter采集数据&#xff0c;还…

逻辑斯特 + 神经网络梯度下降公式推导 + 向量化

全部推导来自吴恩达老师的视频课&#xff0c;下面仅作整理 逻辑斯特 神经网络

手写超级好用的rabbitmq-spring-boot-start启动器

手写超级好用的rabbitmq-spring-boot-start启动器 文章目录 1.前言2.工程目录结构3.主要实现原理3.1spring.factories配置3.2EnableZlfRabbitMq配置3.3RabbitAutoConfiguration配置3.4ZlfRabbitMqRegistrar配置 4.总结 1.前言 由于springBoot官方提供的默认的rabbitMq自动装配不…

insertAdjacentHTML() 作用

insertAdjacentHTML()简介 insertAdjacentHTML() 方法是将文本解析为 element 元素&#xff0c;并将结果节点插入到DOM树中的指定位置。它不会重新解析它正在使用的元素&#xff0c;因此它不会破坏元素内的现有元素。这避免了额外的序列化步骤&#xff0c;使其比直接使用innerH…

机试:数塔路径

问题描述: 代码示例: //数塔路径 #include <bits/stdc.h>using namespace std;int main(){ // 算法思想: // 逆推,将最下方和右下方的数字进行比较,哪个大则加上并更新,直至到根节点即为最大 int n;cin >> n; int nums[n1][n1]; // 输入数塔 for(int i 1;i < n…

搭建Hadoop3.x完全分布式集群

零、资源准备 虚拟机相关&#xff1a; VMware workstation 16&#xff1a;虚拟机 > vmware_177981.zipCentOS Stream 9&#xff1a;虚拟机 > CentOS-Stream-9-latest-x86_64-dvd1.iso Hadoop相关 jdk1.8&#xff1a;JDK > jdk-8u261-linux-x64.tar.gzHadoop 3.3.6&am…

逆变器功率软起斜率要求

安规说明 在NB32004中&#xff0c;有明确要求&#xff0c;有功功率调整速率不得超过正负10%Pn/min&#xff0c;包括起停机。 控制对象 控制功率最终是通过调整D轴电流给定来达到限制功率的目的&#xff0c;所以我们只要让D轴的电流给定限幅值按照10%/min增加就好了。 具体实…

Selenium Web自动化测试——基于unittest框架的PO设计模式

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

一文讲懂 C++ 类和对象(1)

0. 面向过程程序设计和面向对象程序设计的区别 面向对象程序设计往往关注的是怎么去做&#xff0c;是将解决问题的步骤分析出来&#xff0c;然后用函数把步骤一步一步实现&#xff0c;然后再依次调用就可以了。而面向对象是将构成问题的事物&#xff0c;分解成若干个对象&…

比特币创造历史新纪录

综合来源&#xff1a;coindesk and cointelegraph 编译&#xff1a;秦晋 3月11日&#xff0c;比特币在亚洲交易时段首次突破71,000美元&#xff0c;这个是比特币创造的价格新纪录。自1月11日比特币现货ETF在美国获批以来&#xff0c;比特币一直在稳步上涨。以太币突破4000美元。…

rust学习(手动写一个线程池)

哈哈&#xff0c;主要是为了练习一下rust的语法&#xff0c;不喜勿喷。 一.Executor申明 struct AExecutor<T> {results:Arc<Mutex<HashMap<u32,T>>>, //1functions:Arc<Mutex<Vec<ATask<T>>>> //2 } 1.results&#xff1a…

产品测试方案:视频接入平台并发性能测试方案和报告(即150路视频并发流媒体服务器模块的性能测试方案和报告)

目 录 一、测试目的&#xff1a; 二、测试方案&#xff1a; 2.1、测试思路 2.2、拓扑图 三、测试环境 3.1 服务器配置 3.2 网络摄像机列表 3.3 测试软件 四、测试流程 4.1 H.264并发测试&#xff1a; 4.1.1老版本srsout3.10并发测试 4.1.2 新版本srsout…

2024年信息技术与计算机工程国际学术会议(ICITCEI 2024)

2024年信息技术与计算机工程国际学术会议&#xff08;ICITCEI 2024&#xff09; 2024 International Conference on Information Technology and Computer Engineering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 大会主题&#xff1a; 信息系统和技术…

如何选择腾讯云轻量应用服务器地域?北京上海广州哪个合适?

腾讯云轻量应用服务器地域如何选择&#xff1f;地域就近选择&#xff0c;北方选北京地域、南方选广州地域&#xff0c;华东地区选上海地域。广州上海北京地域有什么区别&#xff1f;哪个好&#xff1f;区别就是城市地理位置不同&#xff0c;其他的差不多&#xff0c;不区分好坏…

基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大&#xff0c;容错率低&…

python实现卡普均值最小回路算法

如果给定一个含有环的有向图&#xff0c;要在这个图中找出所有的环并计算这些环的路径长度&#xff0c;然后除以环的边数&#xff0c;所得到的结果也就是环的平均值&#xff0c;这里也就是如何计算这个环的最小均值问题。 首先可以确定的是&#xff0c;如果图中均值最小的环的…

漏洞发现-漏扫项目篇武装BURP浏览器插件信息收集分析辅助

知识点 1、插件类-武装BurpSuite-漏洞检测&分析辅助 2、插件类-武装谷歌浏览器-信息收集&情报辅助 章节点&#xff1a; 漏洞发现-Web&框架组件&中间件&APP&小程序&系统 扫描项目-综合漏扫&特征漏扫&被动漏扫&联动漏扫 Poc开发-Ymal语…

深入浅出落地应用分析:AI虚拟数字人

据艾媒咨询,2025年中国虚拟人市场规模预计达480.6亿元,用户群体主要为中型及小微型企业,产品需求量TOP5分别是电商、卫生、社会保障和社会福利业、教育、金融和运输业,主要产品类型为数字员工及定制化数字人。 一、什么是数字人 1.1 概念介绍 数字人是指以数字形式存在于…

2024年腾讯云轻量服务器地域选择方法_新手地域教程

腾讯云轻量应用服务器地域如何选择&#xff1f;地域就近选择&#xff0c;北方选北京地域、南方选广州地域&#xff0c;华东地区选上海地域。广州上海北京地域有什么区别&#xff1f;哪个好&#xff1f;区别就是城市地理位置不同&#xff0c;其他的差不多&#xff0c;不区分好坏…