如何快速解析以分号相隔的字符串?

原始需求就是如何解析形如:
"a,b,c,1,21,2"这样的字符串?
我尝试了sscanf等方法,也在sscanf中使用了正则表达式,但是发现如果上述字符串有空值时(就是"a,b,c,1,21,2"是"a,b,c,,,2"),就不能正确解析。
目前我是这样做的:
sub = a.substr(0,a.find_first_of(","));
item->Setbase_type(atoi(sub.c_str()));
a = a.substr(sub.length()+1);
循环。。

这种方法可以定位到“,”,当“,”前面为空的时候也能得到空串而不是异常。

问题是,当数据比较大,有四五十个“,”间隔时,代码量很大。
有没有什么简单的方法来解析?

谢谢了!

4个回答

楼主是要这种吗

 #include<iostream>
#include<string.h>
using namespace std;

void main()
{
    string str = "a,b,c,,1,21,2,";
    char buffer[32] = {0};
    while(1)
    {
        sscanf(str.c_str(), "%[^,]", buffer);
        cout << buffer << endl;
        if(str.length() >= 1 + strlen(buffer))
            str = str.substr(1 + strlen(buffer));
        else
            break;
        memset(buffer, 0, 32);
    }
}

图片说明

qq423399099
小灸舞 回复zhaobey: 结构体的成员变量不能改一下?除此之外我也无能为力了
3 年多之前 回复
zhaobey
zhaobey 回复小灸舞: 结构体里面是成员变量比如aaa bbb,你说怎么把这个放在循环里面去赋值?循环里面的名字应该是有规则的吧。
3 年多之前 回复
qq423399099
小灸舞 回复zhaobey: 楼主的结构体里难道有char buffer1[]到char buffer50[]?
3 年多之前 回复
zhaobey
zhaobey 回复小灸舞: 我是要放在一个结构体的变量里面,赋值用循环没法弄
3 年多之前 回复
qq423399099
小灸舞 回复zhaobey: 取值不是就上面那几行代码吗,用vector的话cout那句改成push_back就可以了,之后赋值的话也可以循环赋值啊,不用赋一个值就写一行吧
3 年多之前 回复
zhaobey
zhaobey 回复小灸舞: 这样也可以,只是,一行可能有五十个逗号。然后按照你说的操作的话,也 至少需要50*2行代码(50个取值,50个赋值)。我是在想,直接一行正则表达式行不行
3 年多之前 回复
qq423399099
小灸舞 回复zhaobey: 先截取下来,然后放到数组或者vector里,再拿出来不是一样吗?
3 年多之前 回复
zhaobey
zhaobey 如果我想一次性截取所有段的话,就要写成sscanf(str.c_str(), "%[^,],%[^,],%[^,],%[^,]", buffer1,buffer2,buffer3,buffer4);这种形式了,但是此时如果“,“之间没有内容的话,就读取失败,后面正常的数据也不会读取。如"a,b,,1,2,3",后面的”123“也不会读取。
3 年多之前 回复
zhaobey
zhaobey 如果我想一次性截取所有段的话,就要写成sscanf(str.c_str(), "%[^,],%[^,],%[^,],%[^,]", buffer1,buffer2,buffer3,buffer4);这种形式了,但是此时如果“,”
3 年多之前 回复

正则表达式“,"换成",+"

zhaobey
zhaobey 方便说得更详细些吗
3 年多之前 回复

char *s = "aaa,,ccc,ddd";
char a[32] = {0},b[32] = {0},c[32] = {0},d[32] = {0};

//sscanf(s, "%s,%s,%s,%s\n", a, b, c, d);



sscanf(s, "%[^,],%[^,],%[^,],%s", a, b, c, d);
printf("[%s][%s][%s][%s]\n", a, b, c, d);

输出a有值 bcd没有值 为什么
 char *s = "aaa,,ccc,ddd";
char a[32] = {0},b[32] = {0},c[32] = {0},d[32] = {0};

//sscanf(s, "%s,%s,%s,%s\n", a, b, c, d);



sscanf(s, "%[^,],%[^,],%[^,],%s", a, b, c, d);
printf("[%s][%s][%s][%s]\n", a, b, c, d);

输出a有值 bcd没有值 为什么
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
以分号分隔的字符串的正则表达式
格式 如:2111111;3334344;343434334;rn
如何分解逗号相隔的字符串?
现在一个Str="12,34,56,78,90,as,123";rn如何分把Str分解存储到自定义数组中,因为Str是从文件获取的,Str的长度可能不同,rna[0]="12";rna[1]="34";rn.......rna[6]="123";rnrn
字符串的快速解析
Response response = given().parameters(para).post(url);rn System.out.println(response.getContentType());rn System.out.println(response.getBody().asString());rnrnrntext/html; charset=UTF-8rn"isAdmin":true,"isBelongTeam":true,"isFabuAdmin":true,"isCaAdmin":false,"belongCid":"b7027f82-b947-11e7-b97e-005056bd5c83","isBindWX":false,"token":"252b959a-f09d-4dbb-a15a-468a6dee92d6","uuid":"006eb7fa-b946-11e7-b97e-005056bd5c83"rn现在的问题是我不知道如何快速的解析这个字符串了,请指教!
PB8如何读取以符号相隔的文本文件
文本文件里的数据都是以逗号或者分号或者Tab标记分隔的邮件地址,如何把他们分别读入DataWindow呢?
如何读取以逗号相隔的浮点数据文件
已各数据文件,是浮点型数据,用逗号分隔,有没有很直接的办法进行读取阿,谢谢
如何统计某个以逗号相隔的字段?
表A的某个字段中的值为:rn 表a的结构为 rn id point rn 1 a,b,c,drn 2 a,d,ern 3 drn 4 c,drn 5 a,d rnrn如何求出每个 point 的个数?rn想得到的结果是:rn id point rn 1 4rn 2 3rn 3 1rn 4 2rn 5 2 rnrnrn
字符串,已知字符串“1;SN ;CCTV "把字符串放到Array数组中以分号相隔,Array(0)为1,
Array(1)为SN,Array(2)为CCTV
紧急求助,,,快速解析字符串!!
现在下位机向上位机以字符串的格式发来一组点数据:格式为:j;x;y;x;y;x;y;...x;y;rn最后以分号结束,x,y是平面坐标的点数据,如何以最快的速度将(x,y)分别解析出来?急!!
金额字符串增加分号
C语言中金额字符串增加','。<br>如13345.11 为13,345.11
字符串中有分号怎么办
conn.execute("update buyandsale set pic=replace(pic,'">
Eclipse快速补全行末分号
Eclipse快速补全行末分号 Eclipse快捷键跳到行末补全分号 Eclipse快速结束当前语句(在行末加上分号,就是当前语句结束) Intellij IDEA 里是有快速补全分号的功能(快捷键:Complete Current Statement)的 用惯了这个功能,发现Eclipse里没有,感觉很不习惯 网上找了很久,终于找到了解决方法:安装插件(很简单) 来源:https:/...
VB.NET 如何解析一个字符串,字符串的格式是INI文件的格式。。如何处理";"分号。急
辛苦了。rnrn Public Function getsectionstring(ByVal striniData As String, ByVal sectionname As String) As Stringrnrn Dim reg As Regexrn Dim regexpattern As Stringrnrn Tryrnrn sectionname = sectionname.Replace("[", "")rn sectionname = sectionname.Replace("]", "")rnrn regexpattern = "\[" + sectionname + "\]" + "(?[\w|\s|=]*)"rnrn reg = New Regex(regexpattern, RegexOptions.Singleline)rnrn If reg.IsMatch(striniData) Thenrn Return reg.Match(striniData).Result("$SectionString")rn End Ifrnrn Return String.Emptyrn Catch ex As Exceptionrn Throw exrn End Tryrn rn End Functionrnrn用这个正则表达式的话,如果有个分号的话,那它后边的数据就读不出来,请问如何可以屏蔽到分号。rnrn例如数据:rn[Parameter]rnA=10 cmrnC=20 ; cmrnE=50 cmrnrn这样的数据用上边的方法就出去来E=50 cm。。项目急,请各位帮忙。。谢谢了。
如何快速分解字符串?
01 20 30 58 11 12 13 14 15 16 17 18 19 30rn.............rn几百万行,如何以最快的速度把每一行的整数取出来,有没有好的算法.
删除字符串的最后一个分号
删除字符串的最后一个分号怎么写rn不要种方法rnstring str="P3044;";rnstr=str.Substring(0,str.Length-1) rnrn有其他的方法吗?
strchar[20]="fdsf|2434" 以‘|‘解析字符串
char strchar[20]="fdsf|2434"rnrn用'|'隔开rnchar str[5];rnint n;rnrn怎么使str="fdsf"rnn=2434
分号";"分隔,算出字符串的个数
rn例一 OA7642--------------------最后没有分号,也算1条记录rn例二 OA7642;OA7643-------------这里一个分号分开2条记录,算2条记录rn例三 OA7642;OA7643;------------这里也算2条记录rn例四 OA7642;OA7643;OA7644;-----这里也算3条记录rn..............rnrn现在我要的结果是怎么计算出字符串含有分号";"和不含有分号';'的记录条数
如何解析一个字符串
比如我的程序要返回版本号rn用uname -a 可以得出一个字符串rnLinux localhost.localdomain 2.6.31.5-127.fc12.i686.PAE #1 SMP Sat Nov 7 21:25:57 EST 2009 i686 i686 i386 GNU/Linuxrnrn我已知肯定有2.6 想要得到后面的5个字符.31.5 rn用shell或c怎么写
如何解析字符串呢?
-
如何解析XML字符串
早上好,各位:rn我是XML新手。rn我有一段XML字符串保存在数据库字段中,我想把这段XML字符串按一定的格式显示在网页的某个位置上,请问如何解析XML字符串并按我的格式显示。rn感谢您的任何有益的建议或方法!rn
如何解析字符串
Server IP:192.168.20.47rnrnCPU Status:3%rnRAM Status:2485M/3564MrnHard Disk Status:C:20GB/48GB;D:54GB/195GB;E:40GB/219GBrnNet Status:316Mb/548Mb/7701bps/1776bps/1000Mbpsrnrn比对单元状态:rn比对单元-1: 人脸库=1,模板数=4996,比对次数=0;rnrnLast Update Time:2012-09-07 13:13:33rnrn以上是我从接口中获取出的一系列系统信息 我怎么把这些中文字段替换成其他的中文
如何解析得到字符串
Content-Type: text/plain; charset=UTF8\r rnContent-Length: xx\r rn\r rnstatus=value2\r rnuserId=value3\r rnkey=value4\r rnrn-------rn用j2me的httpconnection在服务器端取到的。rn我想得到userId的值.怎么获取?rn
如何解析这个字符串?
我要把"0x0002||0x0004||0x0008"中的||去掉,变成三个字符串"0x0002","0x0004","0x0008",请问该怎么做?
如何解析SQL字符串
今年暑期的软件实习作业是做一个微型数据库系统;要求支持SQL语句。我对如何解析SQL语句比较困惑, 特地前来求助;比如select username passord from user where user userid=1这样的一句,如何将它 转换成C语言函数?rn我的初步设想是按空格逐个取出字符串。首先判断第一个字符串前是不是关键字(第一个字符不能为空)如果是select,则进入select相关函数继续读取判断from,where等关键字,找到表名、字段名、以及选择条件……rnrn有几个问题没搞懂:rn1、如何有效地提取字符串,即参数。采用字符串栈吗?rn2、这么一堆字符串如何判断错误,如多了一个空格,表名错误……rn3、通过字符串的提取,得到的是字符串;如何将它变成函数参数。比如user提取出来以后是字符串,而现在我要处理的表可能是一个链表结构,二者之间怎么联系。rnrn这和命令参数是不是差不多?
如何解析字符串:14_42_96_0_1_49?
如何解析字符串:14_42_96_0_1_49?到一个数组中为14、42、96、0、1、49
如何解析xml的字符串?
我获得到一个xml的字符串现在要从中取出相应信息请问有什么方便快捷的方法吗 最好能给出例子 rnString xmlstring=rn rn rn rn 1 rn abcrn aaaarn rn rnrn我要取出 "abc" 存入 loginname 和 "aaaa" 存入 nicknamern即: loginname="abc" nickname= "aaaa"rn希望给出详细步骤 谢谢!
如何解析这样的字符串?
像这样的字符串:rnrnaa = "dqere(95622238);gag(016-5215155);"rnrn只想把括号内的数字提取来,再构造成另一个字符串。如何做的?谢谢
如何解析长字符串!!!!
我通过httpPost获得一字符串,格式如下:rnrn"errorCode":null,rn"success":true,rn"sign":"50031DA7FB7796A6FB0D6A65653D78C7",rn"errorMessage":null,rn"requestId":"20130516183049",rn"projects":[rn rn "chargeAreas":[rn "areaName":"四川","cities":["areaName":"成都","areaId":"4000000357059","companies":[],rn "areaName":"北京","cities":["areaName":"北京","areaId":"113271345596","companies":[]],"areaId":"113271345594"rn ],"areaId":"4000000357058"],"projectName":"水费","projectId":"1001","projectAlias":"water"rn ,rn rn "chargeAreas":[rn "areaName":"浙江","cities":["areaName":"宁波","areaId":"3601333306670","companies":["chargeWaies":["fields":["fieldName":"billkey","fieldType":"VARCHAR","required":false,"fieldLabel":"用户号码","minLen":5,"maxLen":10],"wayName":"用户号码","wayId":"3601454127868"],"companyId":"3601454127867","companyName":"宁波市自来水公司","companyAlias":"ningboshizilaishuigongsi"],"areaName":"杭州","areaId":"360103359926","companies":[]],"areaId":"360103359925",rn "areaName":"北京","cities":["areaName":"北京","areaId":"113271345596","companies":[]],"areaId":"113271345594"rn ],"projectName":"水费","projectId":"1001","projectAlias":"water"rn rn ]rnrnrn我使用 JSONObject jsonObject1 = JSONObject.fromObject(result); 这种方法解析该字符串,当我获取其中某个字段值(如:rn String retCode1 = (String) jsonObject1.get("errorCode");)时报错:rn[color=#FF0000]Exception in thread "main" java.lang.ClassCastException: net.sf.json.JSONNull cannot be cast to java.lang.String[/color][b][/b]rn该怎么解决这个问题,如何解析这个字符串,能够方便的获取 errorCode、success、errorMessage、projects的值,也能够获取projects中每个 chargeAreas 的值,以及chargeAreas中各字段值。 希望看到的朋友能帮忙指点一下,谢谢哈!
如何解析字符串?
有一个字符串:“22*33*1*34334*222*11”,我想以“*”为参考解析出“22”、“33”、“1”、“34334”、“222”、“11”放到一个数组中去。rn请问大虾如何做?
如何解析字符串?
刚开始学习编程,碰到如下问题:rn有一个字符串如下:rnloginuser=qqqqqq;UserID=266; UserID__Md5=d6ac5df06e4b8dc1; LoginTime=1307757031; LoginTime__ckMd5=ca8565b28708ce1e;SESSID=dd80d53392b6ba859926663a6a8ee7fernrn我想做一个函数:rn函数的入口参数1是等号前面的字符串,如上面的loginuser,UserID__Md5等,rn函数的入口参数2是源字符串,rn函数实现的功能是根据入口参数输出该参数的值,例如输入参数是loginuser,则输出qqqqqq.rn函数的返回值,就是输入参数的取值.rnrn[code=C/C++]rnCString find_vale(CString name,CString source)rnrn CString value;//返回值rnrn ........... [color=#FF0000]//这里的代码如何编写[/color]rn .......... rnrn return value;rnrnrnrn[/code]rnrn请问如何用MFC实现?
JAVA如何解析字符串
有串字符串。。里面可能包含userID=123456这个字符串。userID也可能等于其他数值或NUll,我如何得到123456这串字符?
如何解析这种字符串?
375 27 5.000 5.000 122 444 333rn375 27 5.000 5.000 122 444 333 375 27 5.000 5.000 122 444 333rn375 27 5.000 5.000 122 444 333 375 27 5.000 5.000 122 444 333 375 27 5.000 5.000 122 444 333rnrn其中数值之间是用空格分割的,如何把其中的数值解析出来
PHP 如何解析字符串
[code=php]data_sell,11001,reputation,38200,sell_reward,0,0,0,0,[],0,[new_ger,11402,1,0],1,-1.rndata_sell,11002,reputation,11900,sell_reward,0,0,0,0,[],0,[new_ger,11403,1,0],1,-1.rndata_sell,11003,reputation,11050,sell_reward,0,0,0,0,[],0,[new_ger,11405,1,0],1,-1.rndata_sell,11004,reputation,40000,sell_reward,0,0,0,0,[],0,[new_ger,11401,1,0],1,-1.rndata_sell,11005,reputation,11050,sell_reward,0,0,0,0,[],0,[new_ger,11406,1,0],1,-1.rndata_sell,11006,reputation,11050,sell_reward,0,0,0,0,[],0,[new_ger,11407,1,0],1,-1.rndata_sell,11007,reputation,10000,sell_reward,0,0,0,0,[],0,[new_ger,11410,1,0],1,-1.rndata_sell,11008,reputation,9600,sell_reward,0,0,0,0,[],0,[new_ger,11412,1,0],1,-1.rndata_sell,11009,reputation,10650,sell_reward,0,0,0,0,[],0,[new_ger,11408,1,0],1,-1.rndata_sell,11010,reputation,8150,sell_reward,0,0,0,0,[],0,[new_ger,11415,1,0],1,-1.rndata_sell,11011,reputation,34600,sell_reward,0,0,0,0,[],0,[new_ger,11414,1,0],1,-1.rndata_sell,11012,reputation,10000,sell_reward,0,0,0,0,[],0,[new_ger,11411,1,0],1,-1.rndata_sell,11013,reputation,34000,sell_reward,0,0,0,0,[],0,[new_ger,11409,1,0],1,-1.rndata_sell,11014,reputation,9600,sell_reward,0,0,0,0,[],0,[new_ger,11413,1,0],1,-1.rndata_sell,11015,reputation,11600,sell_reward,0,0,0,0,[],0,[new_ger,11404,1,0],1,-1.rndata_sell,11016,reputation,12500,sell_reward,0,0,0,0,[],0,[new_ger,12406,1,0],1,-1.rndata_sell,11017,reputation,39400,sell_reward,0,0,0,0,[],0,[new_ger,12401,1,0],1,-1.rndata_sell,11018,reputation,34000,sell_reward,0,0,0,0,[],0,[new_ger,12414,1,0],1,-1.rndata_sell,11019,reputation,13200,sell_reward,0,0,0,0,[],0,[new_ger,12402,1,0],1,-1.rndata_sell,11020,reputation,13050,sell_reward,0,0,0,0,[],0,[new_ger,12404,1,0],1,-1.rndata_sell,11021,reputation,38800,sell_reward,0,0,0,0,[],0,[new_ger,12403,1,0],1,-1.rndata_sell,11022,reputation,12800,sell_reward,0,0,0,0,[],0,[new_ger,12405,1,0],1,-1.rndata_sell,11023,reputation,10150,sell_reward,0,0,0,0,[],0,[new_ger,12413,1,0],1,-1.rndata_sell,11024,reputation,11450,sell_reward,0,0,0,0,[],0,[new_ger,12411,1,0],1,-1.rndata_sell,11025,reputation,12550,sell_reward,0,0,0,0,[],0,[new_ger,12407,1,0],1,-1.[/code]rnphp 如何解析这样的字符串
一个字符串里包含多个分号,怎么得到分号的数量
一个字符串里包含多个分号,怎么得到分号的数量
如何快速的解析dfm文件
根据dfm文件重新生成窗体(侧重速度)
如何过滤掉字符串中 以&开头,以;结尾的所有字符串?
如何过滤掉字符串中 以&开头,以;结尾的所有字符串?
分号
<span>本课程包含<strong>14</strong><strong>章59个小节</strong>课程,内容涵盖:JavaScript 简介、JavaScript基本语法、JavaScript 数据类型、表达式和运算符、语句和流程控制、对象、数组、函数、window 对象、DOM 访问,jQuery等。</span>
为什么类的定义以分号结束
摘自《C++ Primer 中文版(第4版)》李师贤,蒋爱军等译 12.1.5 类对象 我们在第 2.8 节中指出,类的定义分号结束。分号是必需的,因为在类定义之后可以接一个对象定义列表。定义必须以分号结束: class Sales_item { /* ... */ }; class Sales_item { /* ... */ } accum, trans;最佳实践:通常,将对象定义成类定
如何快速高效的查找字符串???
[code=c]struct stInfornrn string strName;rnrnmap testMap; //假如已经存了十万个数据rnstring strSub = "木"; //要求stInfo.strName里含有"木"字rnrnmap::iterator itFind = testMap.begin();rnmap::iterator itEnd = testMap.end()rnstInfo *pInfo = NULL;rnstring strName = "";rnfor ( ; itFind != itEnd ; ++itFind )rnrn pInfo = itFind.second;rn strName = pInfo.strName;rn //找出含有strSub子字符串的strName父字符串rn //求一个快速高效的方法!!!rn[/code]rn
Android 如何快速解析JSON字符串
了解Android的人都知道JSON,JSON是当前最最为通用的两种数据格式之一,对Android有一定了解的人都知道JSON,都知道如何解析JSON无非就是JSONObject和JSONArray两个类的API的使用,但是这样的话在解析较为复杂的JSON字符串的时候会耗费较多的时间,本文就是来讲解如何快速的去解析JSON字符串接下来会向大家介绍两个东西: gson框架和插件GsonFormat
如何最快速的查找字符串?
-
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池