前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++中字符串的分割

C++中字符串的分割

作者头像
卡尔曼和玻尔兹曼谁曼
发布于 2019-01-22 03:01:11
发布于 2019-01-22 03:01:11
7.2K00
代码可运行
举报
运行总次数:0
代码可运行

坚持走下去,坚持下去!男子汉要能忍! —题记

下面开始正题,C++中字符串的分割。 1. 使用strtok函数进行字符串的分割 2. 使用stringstream类配合getline函数进行字符串的分割 3. 使用STL的find函数以及字符串类的substr函数进行字符串分割


strtok函数介绍: 头文件:#include <string.h>

定义函数:char * strtok(char *s, const char *delim);

函数说明:strtok()用来将字符串分割成一个个片段。参数s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。

返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void splitWithStrtok(const char* str, const char* delim, vector<string>& ret)
{
    char* strcopy = new char[strlen(str) + 1];
    strcpy(strcopy, str);
    char *word = strtok(strcopy, delim);
    ret.push_back(word);
    while (word = strtok(nullptr, delim))
        ret.push_back(word);
    delete[] strcopy;
}

getline函数介绍: 头文件:#include <string.h>

函数原型:istream& getline (istream& is, string& str, char delim);

函数说明:从is输入流中提取依次字符存存放到str中直到遇到delim字符或者换行符’\n’。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void splitWithStringStream(const string& str, char delim, vector<string>& ret)
{
    stringstream ss(str);
    string s;
    while (getline(ss, s, delim))
    {
        ret.push_back(s);
    }
}

最后一种方法就是便利字符串依次找分隔符,找到了就提取前一个分隔符到当前分隔符之间的子串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void splitWithSTLFind(const string& str, const string& delim, vector<string>& ret)
{
    size_t front = 0;
    size_t back = str.find_first_of(delim, front);
    while (back != string::npos)
    {
        ret.push_back(str.substr(front, back - front));
        front = back + 1;
        back = str.find_first_of(delim, front);
    }
    if (back - front > 0)
    {
        ret.push_back(str.substr(front, back - front));
    }
}

最后,我们写一个函数测试一下吧!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
    const char* str = "3.14,5.0,12,0";
    const char* delim = ",";
    vector<string> vetnum;

    splitWithStrtok(str, delim, vetnum);
    cout << "使用strtok函数进行字符串分割:" << '\n';
    for (auto iter = vetnum.begin(); iter != vetnum.end(); iter++)
        cout << *iter << '\n';

    vetnum.clear();
    splitWithSTLFind(str, delim, vetnum);
    cout << "使用STL的Find方法进行字符串分割:" << '\n';
    for (auto iter = vetnum.begin(); iter != vetnum.end(); iter++)
        cout << *iter << '\n';

    vetnum.clear();
    splitWithStringStream(str, delim[0], vetnum);
    cout << "使用stringstream类进行字符串分割:" << '\n';
    for (auto iter = vetnum.begin(); iter != vetnum.end(); iter++)
        cout << *iter << '\n';
    _CrtDumpMemoryLeaks();
    return 0;
}

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年01月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
5.java内存模型详细解析
Description of Java Conceptual Diagram(java结构)
用户7798898
2021/10/13
3260
一段处理异常的java代码的字节码解释
从JDK8开始,字节码处理finally时变为通过冗余finally代码块来解决。(jdk7以及之前可以通过jsr跳转指令处理。)
青山师
2023/05/05
2060
【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
装载 HelloWorld.class 字节码文件到 Java 虚拟机内存中 , 会将该字节码文件中的数据进行分解 , 放到不同的内存区域中 ;
韩曙亮
2023/03/29
3310
【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析
" 栈帧 " 中存储的是 局部变量表 , 操作数栈 , 动态链接 , 方法出口 ;
韩曙亮
2023/03/29
4010
【Java 虚拟机原理】栈帧 | 局部变量表 | 操作数栈 | 方法出口 | JVM 指令逐条解析
Java及JVM简介
懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。 
一个风轻云淡
2023/10/15
1480
Java及JVM简介
Java命令之javap初探
javap是jdk自带的一个工具在jdk安装目录的/bin下面可以找到,可以对代码反编译,也可以查看java编译器生成的字节码,对代码的执行过程进行分析,了解jvm内部的工作。
haifeiWu
2018/09/11
6760
通过字节码理解try-catch-finally
结合这个异常表和Code中的注释,可以发现,如果try语句中发生了Exception及其子类异常,那么执行的字节码为第8-16行,最终返回值为2。其他异常的话,则跳到第17行处理,执行第17-23行,最终将异常抛出,方法值没有返回。
Java架构师必看
2021/11/29
3560
1、引言
栈帧对应一个线程的一个方法的内容,用于方法的执行,包括方法执行过程中的变量的临时状态。同时栈帧也执行动态链接,方法的返回值以及分发异常。栈帧被包含在JVM栈中。每一个栈帧包括:
文彬
2022/06/06
3820
1、引言
JVM笔记 -- JVM的发展以及基于栈的指令集架构
虚拟机,就是虚拟的计算机,可以执行一系列虚拟计算机指令,大体上可以分为系统虚拟机和程序虚拟机。它们运行时,都会受到虚拟机提供的资源的限制。
秦怀杂货店
2021/03/07
5690
JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
字节码文件被装载子系统装载到JVM中,字节码执行引擎负责执行这些字节码文件。 装载子系统和执行引擎都是C++的实现。
小小工匠
2021/08/17
3540
2.1 jvm内存模型
Description of Java Conceptual Diagram(java结构)
用户7798898
2020/09/27
4070
2.1 jvm内存模型
通过工具和字节码带你深入理解运行时数据区
上篇文章介绍了JVM运行时数据区的一些概念,这篇文章将通过工具和字节码加深对常用的堆和虚拟机栈部分的理解。
索码理
2022/12/28
2650
通过工具和字节码带你深入理解运行时数据区
[JVM] JVM自动内存管理机制(一)
文本主要就JVM结构和字节码文件,进行分析来展开JVM的学习,后续系列文章会从JVM的多个方面的进行知识总结。
架构探险之道
2019/09/09
5300
[JVM] JVM自动内存管理机制(一)
第一章、JVM和Java体系架构
最快的JVM,因为只使用了JIT,性能好。但是启动慢,需要编译所有字节码为本地机器指令。不过它专注于服务端,启动慢也就无所谓了。
Yuyy
2022/09/21
1910
第一章、JVM和Java体系架构
手写一个简单的JVM--02.模拟运行JVM
虚拟机栈是栈帧的集合的统称,栈帧是虚拟机执行时方法调用和方法执行时的数据结构,它是虚拟栈数据区的组成元素,每一个方法对应了一个栈帧。
付威
2020/06/11
1.4K0
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
字节码文件中保存了源代码编译之后的内容,以二进制的方式存储,无法直接用记事本打开阅读。通过NotePad++使用十六进制插件查看class文件:
寻求出路的程序媛
2024/09/04
730
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
字节码原理浅析 —— 基于栈的执行引擎
虚拟机常见的实现方式有两种:Stack based 的和 Register based。比如基于 Stack 的虚拟机有Hotspot JVM、.net CLR,这种基于 Stack 实现虚拟机是一种广泛的实现方法。而基于 Register 的虚拟机有 Lua 语言虚拟机 LuaVM 和 Google 开发的安卓虚拟机 DalvikVM。
架构狂人
2023/08/16
5690
字节码原理浅析 —— 基于栈的执行引擎
JVM合集之开篇点题
大家在平时的开发过程中是否遇到过StackOverflowError、OutOfMemoryError等类似的内存溢出错误呢?大家又是怎么解决这个问题的?再来,大家在面试过程中有没有被面试官提问过jvm的内部构造及如何优化的夺命连环call呢?今天就让我们来一探究竟,先从jvm的内部构造及原理说起,一步一步带大家解决jvm的优化问题。
阿Q说代码
2021/05/13
3710
JVM合集之开篇点题
如何从字节码角度分析Java问题
很简单的两行代码,如果是你遇到这样的问题,你会怎样去把问题解释清楚?是利用Java运算符顺序将式子拆解,然后一步步运算,还是其他什么办法?
叫我阿柒啊
2022/05/09
5850
如何从字节码角度分析Java问题
敖丙字节一面:能聊聊字节码么?
上一篇《你能和我聊聊Class文件么》中,我们对Class文件的各个部分做了简单的介绍,当时留了一个很重要的部分没讲,不是敖丙不想讲啊,而是这一部分实在太重要了,不独立成篇好好zhejinrong 讲讲都对不起詹姆斯·高斯林
敖丙
2022/04/19
3340
敖丙字节一面:能聊聊字节码么?
推荐阅读
相关推荐
5.java内存模型详细解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文