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

news2024/11/17 11:33:15

一、概述

在 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;
}

运行结果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

数据结构02:线性表 顺序表习题01[C++]

图源&#xff1a;文心一言 考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构02&#xff1a;线性表[顺序表链表]_线性链表-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为线性表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1…

如何使用“Docker registry创建本地仓库,在服务器之间进行文件push和pull”?

1.1、在服务器1&#xff0c;运行registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restart always --name registry registry:2.7.11.2、编辑/etc/docker/daemon.json 文件&#xff0c; 192.168.xxx.xxx 换成你自己 registry 服务的地址 sudo na…

Midjourney绘图欣赏系列【人物篇】(一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

opencv-python连通域分割connectedComponents

文章目录 连通域简介绘图代码函数说明 连通域简介 所谓连通域&#xff0c;即Connected Component&#xff0c;是一组彼此相连的像素点的集合&#xff0c;这些像素点彼此之间可以假设一条互相链接的路径&#xff0c;路径上所有像素的灰度一致&#xff0c;或者符合某个特定的条件…

机器学习模型—随机森林

机器学习模型—随机森林 随机森林(Random Forest)是由斯坦福大学教授Tin Kam Ho在1995年提出的一种组合学习模型。它可以用于分类和回归任务,并在很多现实世界的问题中表现出优异的性能。 随机森林本质上是通过构建多颗决策树,然后将单个树的预测结果进行组合,从而获得更加准…

Python应用数值方法:工程与科学实践指南

信息技术时代的挑战与机遇 我们正处在一个信息技术高速发展的时代&#xff0c;这是一个科技与创新蓬勃发展的时代。大数据与人工智能的崛起&#xff0c;正以前所未有的速度推动着传统技术的智能化变革。这种变革不仅带来了前所未有的机遇&#xff0c;也对科学和工程技术人员的…

【编码魔法师系列_结构型5】外观模式(Facade Pattern)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

goctl-swagger 生成json接口文件

参考&#xff1a; GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境&#xff0c;不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

深入浅出落地应用分析:AI数字人「微软小冰」

hi,各位,今天要聊的是AI小冰,机缘巧合,投递了这家公司的产品,正好最近在看数字人相关的,就详细剖析下这款产品! 前言 小冰,全称为北京红棉小冰科技有限公司,前身为微软(亚洲)互联网工程院人工智能小冰团队,是微软全球最大的人工智能独立产品研发团队。作为微软全…

2024.3.13

1.设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std;cl…

爬虫与DataFrame对象小小结合

import pandas as pd import requests from lxml import etree #数据请求 url"https://www.maigoo.com/brand/list_1715.html" headers{User-Agent:} #数据响应 resrequests.get(url,headersheaders) tree etree.HTML(res.text) #数据解析 titletree.xpath(.//div[c…

vxe-table表格组件的使用已经query函数扩展

最近新项目使用vue3typescript开发后台管理系统&#xff0c;基本上展示内容一致表格的方式展示&#xff0c;所以使用vxe-table组件来开发&#xff0c;主要是为了方便使用工具栏&#xff0c;以及其他表格操作。 vxe-table 开发文档&#xff1a;https://vxetable.cn/#/table/sta…

qiankun:vite/webpack项目配置

相关博文&#xff1a; https://juejin.cn/post/7216536069285429285?searchId202403091501088BACFF113F980BA3B5F3 https://www.bilibili.com/video/BV12T411q7dq/?spm_id_from333.337.search-card.all.click qiankun结构&#xff1a; 主应用base&#xff1a;vue3historyv…

通过Maven创建Web工程

通过Maven创建Web工程 方式一方式二 方式一 1.先创建一个Maven工程 2.把该Maven模块的pom文件里添加一个war 3.选中该Maven模块 点击项目架构 4.手动添加一个Web架构 方式二 1.也是new一个模块 但是直接配置好Web 2.这里就是我IDEA对Maven的设置 3.第一次创建 可能…

JavaEE框架学习笔记——Mybatis篇

四、一级缓存 五、二级缓存 一、Mybatis的Dao编写【mapper代理方式实现】 Mapper代理的开发方式&#xff0c;程序员只需要编写mapper接口&#xff08;相当于dao接口&#xff09;即可。Mybatis会自动的为mapper接口生成动态代理实现类。不过要实现mapper代理的开发方式****&am…

酷开科技大内容战略,打破时间和空间的限制畅快追剧!

随着科技的发展&#xff0c;电视作为家庭娱乐中心设备的角色正在发生改变&#xff0c;它不仅仅 是家庭的娱乐中心&#xff0c;更是成为连接家庭智能家居的中心枢纽&#xff0c;为家庭带来更为丰富和个性化的娱乐体验。深耕大屏十余年&#xff0c;酷开科技通过技术上的不断突破和…

nacos做注册注册中心go语言实战教程(服务的注册与获取)

背景 随着访问量的逐渐增大&#xff0c;单体应用结构渐渐不满足需求&#xff0c;在微服务出现之后引用被拆分为一个个的服务&#xff0c;服务之间可以互相访问。初期服务之间的调用只要知道服务地址和端口即可&#xff0c;而服务会出现增减、故障、升级等变化导致端口和ip也变…

LeetCode Python - 51. N 皇后

目录 题目答案运行结果 题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n …

深度学习——SAM(Segment-Anything)代码详解

目录 引言代码目录segment-anything 代码详解build_sam.pypredictor.pyautomatic_mask_generator.py 引言 从去年年初至今&#xff0c;SAM(Segment Anything )已经问世快一年了&#xff0c;SAM凭借其强大而突出的泛化性能在各项任务上取得了优异的表现&#xff0c;广大的研究者…