c语言字符串定界符,关于c ++:按字符分割字符串

我知道这是一个非常简单的问题,但我只想一次为自己解决

我只想使用字符作为分割定界符将字符串分割成数组。 (很像C#著名的.Split()函数。我当然可以应用蛮力方法,但是我想知道是否有什么更好的方法了。)

到目前为止,我已经搜索过,也许最接近的解决方案是使用strtok(),但是由于不方便(将字符串转换为char数组等),我不喜欢使用它。有没有更简单的方法来实现这一目标?

注意:我想强调这一点,因为人们可能会问:"蛮力为什么不起作用"。我的暴力解决方案是创建一个循环,并在其中使用substr()函数。但是,由于它需要起点和长度,因此在我想分割日期时会失败。因为用户可能输入的时间是2012年7月12日或2011年7月3日,所以在计算" /"定界符的下一个位置之前,我可以真正说出长度。

拆分字符串C ++的可能重复项

使用向量,字符串和stringstream。有点麻烦,但可以解决问题。

std::stringstream test("this_is_a_test_string");

std::string segment;

std::vector<:string> seglist;

while(std::getline(test, segment, '_'))

{

seglist.push_back(segment);

}

导致向量的内容与

std::vector<:string> seglist{"this","is","a","test","string" };

实际上,这种方法正是我所寻找的。很容易理解,不使用外部库,只是非常简单。谢谢@thelazydeveloper!

如果要提高性能,可以添加seglist.reserve(std::count_if(str.begin(), str.end(), [&](char c) { return c == splitChar; }) + (str.empty() ? 1 : 0));如果要拆分的原始字符串存储在str中。

喜欢RegEx的人的另一种方式(C ++ 11 / boost)。就我个人而言,我非常喜欢RegEx这类数据。 IMO比使用分隔符简单地分割字符串要强大得多,因为您可以根据需要选择对构成"有效"数据的内容更加了解。

#include

#include     // copy

#include     // back_inserter

#include        // regex, sregex_token_iterator

#include

int main()

{

std::string str ="08/04/2012";

std::vector<:string> tokens;

std::regex re("\\d+");

//start/end points of tokens in str

std::sregex_token_iterator

begin(str.begin(), str.end(), re),

end;

std::copy(begin, end, std::back_inserter(tokens));

}

因此,您可以在代码中包括整个正则表达式匹配器,仅用于拆分字符串。伤心...

@Dev否,包括一个正则表达式匹配器,以便对构成有效数据的内容更加智能-例如选择数字,并允许使用其他分隔符,例如点或连字符

就二进制大小和整体效率而言,这都是不好的,但是由于这两个原因都不涉及这种情况,因此我不再继续。

@Dev如果一个人对二进制大小有如此极端的约束,那么他们甚至应该重新考虑使用C ++,或者至少使用它的标准库(例如string / vector / etc),因为它们都会产生类似的效果。关于效率,最好的建议来自Donald Knuth-"过早的优化是万恶之源";换句话说,在进行优化之前,首要任务是确定是否存在问题,然后通过诸如剖析之类的客观手段来确定原因,而不是浪费时间试图寻找每一个可能的微观优化。

"在这种情况下,两个人都不关心"-我自己。

@Dev然后我想知道什至提起它们的目的是什么。

我只是不想将整个正则表达式引擎用于查找整数。但是,如果您不想专门化代码,这很好。

Boost具有您要在algorithm/string.hpp中查找的split():

std::string sample ="07/3/2011";

std::vector strs;

boost::split(strs, sample, boost::is_any_of("/"));

另一种可能性是使流具有使用特殊ctype构面的语言环境。流使用ctype构面确定什么是"空白",将其视为分隔符。使用将分隔符分类为空格的ctype构面,读取结果可能非常简单。这是实现方面的一种方法:

struct field_reader: std::ctype {

field_reader(): std::ctype(get_table()) {}

static std::ctype_base::mask const* get_table() {

static std::vector<:ctype_base::mask>

rc(table_size, std::ctype_base::mask());

// we'll assume dates are either a/b/c or a-b-c:

rc['/'] = std::ctype_base::space;

rc['-'] = std::ctype_base::space;

return &rc[0];

}

};

我们通过使用imbue告诉流使用包含它的语言环境,然后从该流中读取数据来使用它:

std::istringstream in("07/3/2011");

in.imbue(std::locale(std::locale(), new field_reader);

设置好后,拆分几乎变得微不足道-只需使用几个istream_iterator初始化向量以从字符串(嵌入在istringstream中)读取片段即可:

std::vector<:string>((std::istream_iterator<:string>(in),

std::istream_iterator<:string>());

显然,如果只在一个地方使用它,则可能会导致过度杀伤。但是,如果您使用过多,则在保持其余代码的整洁度方面可能要走很长的路要走。

我天生不喜欢stringstream,尽管我不确定为什么。今天,我编写了此函数,以允许将std::string通过任意字符或字符串拆分为向量。我知道这个问题很旧,但是我想分享一种拆分std::string的替代方法。

尽管可以很容易地修改它以包括它们,但是该代码完全省略了从结果中分割出的字符串部分。

#include

#include

void split(std::string str, std::string splitBy, std::vector<:string>& tokens)

{

/* Store the original string in the array, so we can loop the rest

* of the algorithm. */

tokens.push_back(str);

// Store the split index in a 'size_t' (unsigned integer) type.

size_t splitAt;

// Store the size of what we're splicing out.

size_t splitLen = splitBy.size();

// Create a string for temporarily storing the fragment we're processing.

std::string frag;

// Loop infinitely - break is internal.

while(true)

{

/* Store the last string in the vector, which is the only logical

* candidate for processing. */

frag = tokens.back();

/* The index where the split is. */

splitAt = frag.find(splitBy);

// If we didn't find a new split point...

if(splitAt == string::npos)

{

// Break the loop and (implicitly) return.

break;

}

/* Put everything from the left side of the split where the string

* being processed used to be. */

tokens.back() = frag.substr(0, splitAt);

/* Push everything from the right side of the split to the next empty

* index in the vector. */

tokens.push_back(frag.substr(splitAt+splitLen, frag.size()-(splitAt+splitLen)));

}

}

要使用,只需像这样致电...

std::string foo ="This is some string I want to split by spaces.";

std::vector<:string> results;

split(foo,"", results);

现在,您可以随意访问向量中的所有结果。就这么简单-没有stringstream,没有第三方库,没有回到C!

您对为什么会更好会有任何争议?

看看boost :: tokenizer

如果您想汇总自己的方法,则可以使用std::string::find()确定拆分点。

感谢您的字符串查找提示。永远喜欢听到std解决方案!

erase()函数呢?如果您知道要在字符串中拆分的位置,则可以使用erase()"提取"字符串中的字段。

std::string date("01/02/2019");

std::string day(date);

std::string month(date);

std::string year(date);

day.erase(2, string::npos); //"01"

month.erase(0, 3).erase(2); //"02"

year.erase(0,6); //"2019"

您是否有理由不想将string转换为字符数组(char*)?调用.c_str()相当容易。您还可以使用循环和.find()函数。

弦类

字符串.find()

字符串.c_str()

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

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

相关文章

vue 组件不受全局样式影响_组件库引入全局样式lib/style/index.css,会污染全局基础样式...

I have searched the issues of this repository and believe that this is not a duplicate.Version1.3.14Environmentmacos 10.14.6&#xff0c;chrome76.0.3809.100(正式版本)&#xff0c;vue 2.6Reproduction linkSteps to reproduce在chrome extension 插件开发中使用ant-…

ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11

前面发了几个求助的帖子&#xff0c;希望有朋友能提供些Factory Talk View V11的安装和授权&#xff0c;但是一直没有什么回复&#xff0c;今天结合别人的经验&#xff0c;算是把授权安装搞定了&#xff0c;在这里发布出来&#xff0c;希望能帮助到更多的朋友&#xff0c;授权和…

c++ udp多线程 例子_[内附完整源码和文档] 基于udp实现tcp功能进行大文件传输

一.项目要求Please choose one of following programing languages: C, C, Java, Python;本项目采用的是python3.6LFTP should use a client-server service model;本项目使用客户端-服务器的模式LFTP must include a client side program and a server side program; Client s…

jquery设置video的宽度_jquery html5 视频播放控制代码

jQuery HTML5 视频播放控制核心代码&#xff1a;您的浏览器不支持html5&#xff01;$(video).click(function() {if ($(this).hasClass(pause) ) {$("video").trigger("play");$(this).removeClass(pause);$(this).addClass(play);} else {$("video&q…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;算术是什么意思数学什么是算术和算术和是正数的和&#xff0c;即绝对值的和&#xff0c;例如213.57&#xff0c;…

嘉兴python培训_嘉服集团

请下拉查看…… 嘉服集团工作简报2020年第10期 嘉服集团工作简报2020年第9期 嘉服集团工作简报2020年第8期 嘉服集团工作简报2020年第7期 嘉服集团工作简报2020年第6期 嘉服集团工作简报2020年第5期 嘉服集团工作简报2020年第4期 嘉服集团工作简报2020年第3期 嘉服集团工作简报…

steam有没有c语言软件,【图片】在steam吧你甚至可以讨论c语言_steam吧_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include /*包含字符串处理函数的头文件&#xff0c;可以直接调用现有的字符串处理的一系列函数了*/#includeusing namespace std;typedef struct //定义结构体{char score; /*编号*/char name[10]; /*姓名*/char num[15];…

c++ vscode 自动注释_WIN下vscode调试C/C++,从零开始生成helloworld项目【2018年6月29日】...

最近迷上了vscode这款编译器&#xff0c;小巧美观&#xff0c;用起来也很顺手&#xff0c;最主要的是全平台&#xff0c;正好最近要上手做Linux C客户端&#xff0c;以前没接触过linux&#xff0c;先拿它先在WIN上练练手。这几天在网上找了非常多的教程&#xff0c;win总是配不…

AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc

一个基于AVR单片机的计算器程序#include#include//延时函数的头文件#include // 中断函数的头文件#define uint unsigned int#define uchar unsigned char#define BIT(k) (1<#define DI PORTC //夜晶的数据输入端#define No_key 255//没有按键按下的返回值#define key_port …

python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...

作者 | 灰小猿责编 | 王晓曼出品 | CSDN博客最近在做项目开发的时候&#xff0c;跟小伙伴聊到修 Bug 这件事。嗯&#xff0c;对于一只没技术的程序猿来说&#xff0c;修 Bug 的确是一件让人头疼的事情&#xff0c;尤其是对于比较大型的项目开发&#xff0c;在变量较多的时候&am…

vue中传值和传引用_vue prop属性传值与传引用示例

vue prop属性传值与传引用示例vue组件在prop里根据type决定传值还是传引用。简要如下&#xff1a;传值&#xff1a;String、Number、Boolean传引用&#xff1a;Array、Object若想将数组或对象类型也以值形式传递怎么办呢&#xff1f;如下方式可以实现&#xff1a;// component-…

.sql文件_Mysql分组排序及Sql文件执行

最近在做一个临时项目&#xff0c;采用的是mysql开发&#xff0c;主要涉及两个问题&#xff1a;1.一个是传参问题&#xff1b;2.另一个是实现对数据分组取前4的数据。个人感觉很有意义&#xff0c;特此记录一下。一.传参问题执行mysql文件&#xff0c;需要从外部传入参数时&…

laravel 异常捕获_Laravel框架捕获各种类型错误

Laravel 中的所有异常都由类App\Exceptions\Handler集中处理&#xff0c;这个类有两个方法&#xff1a;report 和 render。【report 方法】report 方法用于记录异常并将其发送给外部服务。默认情况下&#xff0c;report 方法只是将异常传递给异常基类并写入日志进行记录&#x…

android 动态库 后缀,Android Robolectric加载运行本地So动态库

前言Robolectric 是 Android 的单元测试框架&#xff0c;运行无需 Android 真机环境直接运行在 JVM 之上&#xff0c;所以在 test case 运行速度效率上有了很大提升&#xff0c;接近于 Java JUnit test(JUnit test > Robolectric ≫ androidTest)。不过框架本身并不支持 so …

java web输出语句到控制台_Java工程师(6).循环结构

搞清楚循环结构语句的执行效果与使用场景。程序中的循环流程程序中的循环流程试着编写程序实现下列功能&#xff1a;在控制台中输出100个Hello字符串。在控制台中输出从 1 到 100 的数字。… …循环结构的三要素循环结构必然包含如下三要素&#xff1a;循环变量 &#xff08;循…

sap生产工单报工_SAP系统PP (ProductionPlanning) 模块知识培训

SAP系统PP(ProductionPlanning)模块知识培训主要内容为支持生产系统规范使用SAP系统开展日常业务&#xff0c;掌握SAP系统常用操作和异常处理的方法&#xff0c;人力资源部在6月10日下午组织实施了一期《SAP系统PP模块知识》的培训。本次培训由信息技术部主管工程师解虎授课&am…

android加载百分比功能,android进度条怎么显示百分比

android布局文件里的ProgressBar长形进度条怎么自 在windows操作系统下Android studio按照如下步骤自动义ProgressBar长形进度条的样式。首先创建一个android项目&#xff0c;打开其中的XML布局文件&#xff0c;如下图&#xff1a;添加ProgressBar控件&#xff0c;如下图&#…

64位程序怎么判断指针是否有效_AArch64应用程序级编程模型

根据实现选择&#xff0c;体系结构支持多级执行特权&#xff0c;由从EL0到EL3的不同异常级别表示。EL0对应于最低的特权级别&#xff0c;通常被描述为无特权。应用层程序员模型是在EL0上执行软件的程序员模型。系统软件决定异常级别&#xff0c;因此决定软件运行的特权级别。当…

n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景

嘿&#xff0c;你有没有经历过&#xff0c;出门在外来大姨妈却没带M巾呢&#xff1f;尴尬丛生的你选择怎么做&#xff1f;现在&#xff0c;有了新选择&#xff0c;这也是今天我们迫不及待想要和你们介绍的新朋友—飞么盒子&#xff0c;由Faimes飞么品牌自主研发出品的卫生巾售卖…

Android代码设置角标,Android上的Badge,快速实现给应用添加角标

应用角标是iOS的一个特点&#xff0c;原生Android并不支持。或许是由于当时iOS的通知栏比较鸡肋(固然如今已经改进了不少)&#xff0c;而Android的通知栏功能强大&#xff1f;因此才出现了一方依赖于数字角标&#xff0c;一方坚持强大的通知栏&#xff0c;在平常使用中这两种交…