c++如何实现字符串分割函数split?(代码示例)

在学习c++++中string相关基本用法的时候,发现了sstream的istringstream[1]可以将字符串类似于控制台的方式进行输入,而实质上这个行为等同于利用空格将一个字符串进行了分割。

c++如何实现字符串分割函数split?(代码示例)

于是考虑到可以利用这个特性来实现c++库函数中没有的字符串分割函数split

string src("Avatar 123 5.2 Titanic K");istringstream istrStream(src); //建立src到istrStream的联系string s1, s2;int n;  double d;  char c;istrStream >> s1 >> n >> d >> s2 >> c;//以空格为分界的各数值则输入到了对应变量上

实现细节

目的是可以像js中一样,调用一个函数即可以方便地获取到处理完毕后的字符串数组,根据c++的实际情况再进行参数调整。

立即学习“C++免费学习笔记(深入)”;

1. 输入输出:

string* split(int& length, string str, const char token = ' ')

返回:处理完的字符串数组的首地址
传入:字符串str、分隔符token(默认参数为空格)、以及引用参数length,指明处理完毕后动态分配的数组长度

2. 数据透明处理:
由于istringstream会像cin一样,把空格视为数据间的界限,所以当分隔符不是空格时,需要将传入的分隔符换为空格,并且要提前对原有空格进行数据透明处理
字符替换利用了库algorithm中的replace() [2]

  const char SPACE = 0;  if(token!=' ') {    // 先把原有的空格替换为ASCII中的不可见字符    replace(str.begin(), str.end(), ' ', SPACE);     // 再把分隔符换位空格,交给字符串流处理    replace(str.begin(), str.end(), token, ' ');  }
  假设输入字符串为:"a b,c,d,e,f g"  分隔符为非空格:','  则被替换为:"aSPACEb c d e fSPACEg"

3. 数据分割:

  //实例化一个字符串输入流,输入参数即待处理字符串  istringstream i_stream(str);     //将length置零  length = 0;   queue q;  //用一个string实例s接收输入流传入的数据,入队并计数  string s;  while (i_stream>>s) {    q.push(s);    length++;  }

4. 数组生成:

  //根据计数结果动态开辟一个字符串数组空间  string* results = new string[length];   //将队列中的数据转入数组中  for (int i = 0; i < length; i++) {    results[i] = q.front();    //将替换掉的空格进行还原    if(token!=' ') replace(results[i].begin(), results[i].end(), SPACE, ' ');    q.pop();  }

完整代码

#include #include #include #include #include using namespace std;string* split(int& length, string str,const char token = ' ') {  const char SPACE = 0;  if(token!=' ') {    replace(str.begin(), str.end(), ' ', SPACE);    replace(str.begin(), str.end(), token, ' ');  }  istringstream i_stream(str);  queue q;  length = 0;  string s;  while (i_stream>>s) {    q.push(s);    length++;  }  string* results = new string[length];  for (int i = 0; i < length; i++) {    results[i] = q.front();    q.pop();    if(token!=' ') replace(results[i].begin(), results[i].end(), SPACE, ' ');  }  return results;}//测试:int main() {  int length;  string* results = split(length, "a b,c,d,e,f g", ',');  for (int i = 0; i < length; i++) cout<<results[i]<<endl;  return 0;}

本文来自 C#.Net教程 栏目,欢迎学习!

以上就是c++++如何实现字符串分割函数split?(代码示例)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1433373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 09:07:01
下一篇 2025年12月12日 18:09:27

相关推荐

  • C#正则表达式元字符详解

    本文整理c#正则表达式的元字符,正则表达式是由字符构成的表达式,每个字符代表一个规则,表达式中的字符分为两种类型:普通字符和元字符。普通字符是指字面含义不变的字符,按照完全匹配的方式匹配文本,而元字符具有特殊的含义,代表一类字符。 把文本看作是字符流,每个字符放在一个位置上,例如,正则表达式 “Ro…

    2025年12月17日 好文分享
    000
  • c++输出语句

    C++ 标准库提供了一组丰富的输入/输出功能,C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。 标准输出流(cout) 预定义的对象 cout 是 iostream 类的一个实例。cout 对象”连接&…

    2025年12月17日
    000
  • c++基础知识

    c++++基础知识 C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。C语言是…

    2025年12月17日
    000
  • c++类型转换

    c++++类型转换 在 C 语言中,进行类型转换只需要在变量前面加上变量类型,并且转换可以是双向的。例如 int 类型可以转换为 double 类型,double 类型也可以转换为 int 类型。(推荐教程:c++手册教程) 但是这种简单粗暴的方式在 C++ 中是不合适的。第一,无法完成 C++ 中…

    2025年12月17日
    000
  • c++学习路线

    一、初级入门阶段 数据类型、变量、内存布局、指针基础; 字符串、一维数组、二维数组; 一级指针,二级指针,三级指针,N级指针概念,指针数组和数组指针; 结构体、文件的使用; 立即学习“C++免费学习笔记(深入)”; 动态库的封装和设计; 函数指针回调函数。 面向对象编程思想; 类的封装,构造和析构、…

    2025年12月17日
    000
  • c++怎么运行

    为了让机器能够识别并运行程序,每条语句必须被转为低级机器语言指令,然后将指令按照可执行目标程序的格式打包,并以二进制磁盘文件的形式存放起来。以c程序为例,转换过程大致分为预处理,编译,汇编,链接四个步骤。 详细步骤: 1、预处理器根据以字符#开头的命令修改原始的c程序,结果得到另一个c程序,通常以.…

    2025年12月17日
    000
  • c++换行符有哪些

    c++++换行符有哪些 n 换行,光标移到下一行的开头; endl,把缓冲槽的内容输出到控制台; r 回车,光标移到当前行的开头,不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖; #include using namespace std; int main() { cout <&…

    2025年12月17日
    000
  • c++异常处理的方法

    c++++异常处理 程序运行时常会碰到一些异常情况,例如:做除法的时候除数为 0;用户输入年龄时输入了一个负数;用 new 运算符动态分配空间时,空间不够导致无法分配;访问数组元素时,下标越界;打开文件读取时,文件不存在等等。 这些异常情况,如果不能发现并加以处理,很可能会导致程序崩溃。 所谓“处理…

    2025年12月17日
    000
  • c#用什么软件编程?

    c#可有的编程软件:Visual Studio、Visual Studio Code、MonoDevelop、SharpDevelop、Rider、SlickEdit、C# Pad、Jdoodle、.NET Fiddle、Scriptcs等等。 C#是微软公司发布的一种面向对象的、运行于.NET F…

    2025年12月17日 好文分享
    000
  • 怎么精通C语言?

    对于c语言,很多人都知道,可能也有很多人大学甚至中学也学习过,可能只是熟悉或者仅仅了解,能说自己精通的应该能在前面的基础上能砍掉大部分人,所以有人就想知道,那该怎样才能精通c语言呢? 一. 先具备一定的计算机基础,为后续提升做好准备 是科班出身的直接学习C语言,算是驾轻就熟,相对来说障碍少一些。不是…

    2025年12月17日
    000
  • c#如何防止sql注入?

    对于网站的安全性,是每个网站开发者和运营者最关心的问题。网站一旦出现漏洞,那势必将造成很大的损失。为了提高网站的安全性,首先网站要防注入。 下面我们给大家介绍C#防止sql注入的几种方法: 方法一: 在Web.config文件下面增加一个如下标签:    其中key是 后面的值为”OrderId-i…

    2025年12月17日
    000
  • c语言的代码是什么?

    C语言的代码指的是根据C语言编写规则所写出的程序语句、计算机指令;C语言代码的存储文件扩展名一般为“.c”文件或者是“.h”文件,分别对应C源文件(source file)和C头文件(header file)。 C语言是一门编程语言。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产…

    2025年12月17日
    000
  • 学好c语言可以干什么?

    在学习的过程中,应该会有很多人会很疑惑,我学这个干嘛?对我以后能有什么帮助呢?我想,其中也会有朋友疑惑,学好c语言能干什么?下面小编将给大家解答疑惑。 C语言是一种计算机程序设计语言。具有高级语言的特点,又具有汇编语言的特点。它是许多高级计算机语言的基础。 当你学会C语言之后你可以: (1)可以用C…

    2025年12月17日
    000
  • c#怎么学

    c#是微软公司发布的一种面向对象的、运行于.net framework和.net core(完全开源,跨平台)之上的高级程序设计语言;是一种安全的、稳定的、简单的、优雅的,由c和c++衍生出来的面向对象的编程语言。 推荐课程:C#教程。 如果你想学好C#!  把C#当成一门新的语言学习;  看《C#…

    2025年12月17日
    000
  • C#中default什么意思

    c#中default一般用于switch语句中或者泛型代码中,在switch语句中default是处理非case匹配的默认情况。在泛型中使用default分为两种情况,在引用类型中将泛型类型初始化null,值类型中将泛型类型初始化为0 default 关键字可在switch语句或泛型代码中使用。 s…

    2025年12月17日
    000
  • c++ 图解层序遍历和逐层打印智能指针建造的二叉树

    二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不胜数。然而大多数文章都是讲解的前序/中序/后序遍历,有关逐层打印元素的文章并不多,已有文章的讲解也较为晦涩读起来不得要领。本文将用形象的图片加上清晰的代码帮助你理解层序遍历的实现,同时我们使用现代c++++提供的智能指针来简化树形数据结构…

    2025年12月17日 好文分享
    000
  • C#中的console是什么意思

    C#中的console表示控制台。console是一个类,它封装了控制台的一些基本操作,如【Console.Write】,表示向控制台直接写入字符串。 C#之Console Console.Write  表示向控制台直接写入字符串,不进行换行,可继续接着前面的字符写入。 Console.WriteL…

    2025年12月17日
    000
  • c语言数组怎么输入?

    在C语言中,有两个函数可以让用户从键盘上输入数组数据,它们分别是gets()和scanf()。scanf()是通过格式控制符%s输入数组字符串,除了字符串,还能输入其他类型的数据;gets()是直接输入数组字符串,并且只能输入字符串。 但是,scanf()和gets()是有区别的。 scanf()读…

    2025年12月17日
    000
  • 在C/C++中如何使用extern关键字

    c++sdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css”/> 本篇文章介绍的是c/c++中extern关键字的用法,其中主要谈到修饰变量时的用法,可以参考一下,希望对你有所帮助。 1.基本…

    好文分享 2025年12月17日
    000
  • 如何在C#中使用Bogus去创建模拟数据

    Bogus, 一个基于C#的简单数据生成器。使用Bogus生成模拟数据, 你只需要定义规则并生成数据即可,就是这么简单。而且Bogus可以生成固定数据或者变化数据。这样一旦你拿到了这些数据,你就可以把它们序列化成你想要的格式: json, xml,数据库或者文本文件。 生成模拟数据 为了生成模拟数据…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信