基于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;
}

运行结果:

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

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值