免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9216 | 回复: 10
打印 上一主题 下一主题

如何快速高效分割字符串 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-30 13:22 |只看该作者 |倒序浏览
初次学习c++,写了如下程序,来分割字符串。请大伙儿给指点指点。
要读取的文件格式如下:
a|b|c|d|10|12
b|c|d|e|11|13
c|d|e|f|12|14
A|B|C|D|10|12
程序如下:
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
struct line {
&nbsp;&nbsp;&nbsp;&nbsp;string key1;
&nbsp;&nbsp;&nbsp;&nbsp;string key2;
&nbsp;&nbsp;&nbsp;&nbsp;string key3;
&nbsp;&nbsp;&nbsp;&nbsp;string key4;
&nbsp;&nbsp;&nbsp;&nbsp;int val1;
&nbsp;&nbsp;&nbsp;&nbsp;int val2;
};

line explode(string str) {
&nbsp;&nbsp;&nbsp;&nbsp;line buf;

&nbsp;&nbsp;&nbsp;&nbsp;buf.key1 = strtok((char*)str.c_str(), "|");
&nbsp;&nbsp;&nbsp;&nbsp;buf.key2 = strtok(NULL, "|");
&nbsp;&nbsp;&nbsp;&nbsp;buf.key3 = strtok(NULL, "|");
&nbsp;&nbsp;&nbsp;&nbsp;buf.key4 = strtok(NULL, "|");

&nbsp;&nbsp;&nbsp;&nbsp;string tmp = strtok(NULL, "|");
&nbsp;&nbsp;&nbsp;&nbsp;buf.val1 = atoi(tmp.c_str());
&nbsp;&nbsp;&nbsp;&nbsp;tmp = strtok(NULL, "|");
&nbsp;&nbsp;&nbsp;&nbsp;buf.val2 = atoi(tmp.c_str());

&nbsp;&nbsp;&nbsp;&nbsp;return buf;
}

int main(int argc, char* argv[]) {

&nbsp;&nbsp;&nbsp;&nbsp;ifstream in(argv[1]);
&nbsp;&nbsp;&nbsp;&nbsp;string strtmp;
&nbsp;&nbsp;&nbsp;&nbsp;line tmp;

&nbsp;&nbsp;&nbsp;&nbsp;while (getline(in, strtmp, 'n')) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = explode(strtmp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << tmp.key1 << "|" << tmp.key2 << "|" << tmp.key3 << "|" << tmp.key4 << "|" << tmp.val1 << "|" << tmp.val2 << endl;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


定义了一个结构体,按行读取文件,按“|”分割每行的内容,存入结构体中。
如何来优化此程序呢?
感觉c++的字符处理很麻烦,亦或者是我还没掌握好吧,请大家指教一二。

论坛徽章:
0
2 [报告]
发表于 2009-03-30 13:40 |只看该作者
不用strtok函数,一个字符一个字符比较不行么?

论坛徽章:
0
3 [报告]
发表于 2009-03-30 14:03 |只看该作者
有可以直接用的函数d

论坛徽章:
0
4 [报告]
发表于 2009-03-30 14:18 |只看该作者

回复 #3 gobbin 的帖子

which one ?

论坛徽章:
0
5 [报告]
发表于 2009-03-30 15:05 |只看该作者

回复 #2 gawk 的帖子

遇到空格或者指定字符就返回,是么?

论坛徽章:
0
6 [报告]
发表于 2009-03-30 15:08 |只看该作者
分割字符串用strtok已经足够高效了
字符处理当然麻烦,不用stl string的话,保存变长字符串更麻烦
只是为了完成字符处理的功能,或者完成一个任务,完全可以用perl, php等好用的东西

论坛徽章:
0
7 [报告]
发表于 2009-03-30 15:12 |只看该作者
文件格式这么简单,可以直接用char*指针指。。

论坛徽章:
0
8 [报告]
发表于 2009-03-30 15:12 |只看该作者

回复 #6 Strange 的帖子

这只是第一步处理,完成以后还需要其他处理,后继的没有列出来呀

论坛徽章:
0
9 [报告]
发表于 2009-03-30 15:15 |只看该作者
C分割字符串,这应该是比较好的办法了

论坛徽章:
0
10 [报告]
发表于 2009-03-30 15:18 |只看该作者
用C的格式化输入,很简单的

  1. #include <stdio.h>
  2. int main(int argc,char* argv[])
  3. {
  4.         char x1[100],x2[100],x3[100],x4[100],x5[100],x6[100];
  5.         char a[] = "a|b|c|d|10|12";
  6.         char *p;
  7.         for (p=a;*p!='\0';p++)
  8.                 if (*p=='|')
  9.                         *p=' ';
  10.         sscanf(a,"%s %s %s %s %s %s",x1,x2,x3,x4,x5,x6);
  11.         printf("%s,%s,%s,%s,%s,%s",x1,x2,x3,x4,x5,x6);
  12.         return 0;
  13. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP