zoukankan      html  css  js  c++  java
  • 【C++】使用istringstream分割字符串

    在 C++ 中,可以使用 istringstream 配合 getline 方便地根据分隔符来分割字符串。

    istringstream, ostringstream, stringstream区别

    这 3 个 stream 都可以通过头文件 #include <sstream> 引入。三者的区别如下:

    • ostringstream : 用于执行 C 风格字符串的输出操作。
    • istringstream : 用于执行 C 风格字符串的输入操作。
    • stringstream : 同时支持 C 风格字符串的输入输出操作。

    通常,ostringstream 类用来格式化字符串,避免申请大量的缓冲区,替代sprintf。该类能够根据内容自动分配内存,其对内存管理也是相当到位。这篇文章中,我们使用 istringstream 来分割字符串。

    字符串分割

    首先,我们使用一个字符串s来初始化输入字符串流istringstream

    string s = "a/b/c/d";
    istringstream iss(s);
    

    然后,我们使用 getline 函数通过 iss 对字符串进行分割,getline 函数的原型为

    istream& getline ( istream &is , string &str , char delim );
    

    第一个参数为 is 表示一个 istringstream,这里就是 iss,第二个参数表示我们要将字符串分割的结果通过 getline 逐个放入 str 中,第三个参数为分隔符,注意分隔符只能为字符型。示例如下:

    #include <sstream>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        string s = "a/b/c/d";
        istringstream iss(s);
        string buffer;
        while(getline(iss, buffer, '/')){
            cout<<buffer<<endl;
        }
        return 0;
    }
    

    输出:

    如果我们将字符串 s 设为 a/b//c//d,代码其余不变,则结果为

    可以看到,两个连续的分隔符会被解析为空串。

    封装

    可以将字符串分割简单地封装成一个split函数:

    #include <sstream>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    /**
    *分割字符串,输入待分割的字符串s以及分割符sep;
    *这里没有对分割可能得到的空串进行处理,可以直接删除空串
    */
    vector<string> split(string s, char sep)
    {
        istringstream iss(s);
        vector<string> res;
        string buffer;
        while(getline(iss, buffer, sep)){
            res.push_back(buffer);
        }
        return res;
    }
    
    int main()
    {
        string s = "a/b/c/d";
        vector<string> res = split(s, '/');
        for(int i=0; i<res.size(); i++) cout<<res[i]<<" ";
        cout<<endl;
        return 0;
    }
    
    

    参考

    1、https://blog.csdn.net/qq_36743440/article/details/91999615
    2、https://segmentfault.com/a/1190000020863841
    3、https://blog.csdn.net/hellokandy/article/details/54585174

  • 相关阅读:
    设计模式学习--------8.抽象工厂模式学习
    设计模式学习--------7.工厂方法模式学习
    算法学习---对象类型的数组二分查找实现
    算法学习---基本数据类型的数组二分查找实现
    设计模式学习--------6.单例模式学习
    设计模式学习--------5.适配器模式学习
    tomcat 部署指南
    《Tomcat权威指南》读书笔记
    字典排序
    zabbix agentd错误日志解决办法
  • 原文地址:https://www.cnblogs.com/flix/p/13594908.html
Copyright © 2011-2022 走看看