免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tyguaike
打印 上一主题 下一主题

[算法] c语言怎么实现分隔 [复制链接]

论坛徽章:
0
141 [报告]
发表于 2014-08-25 21:55 |只看该作者
我也贴个C++的。
  1. #ifdef _MSC_VER
  2. #define _SCL_SECURE_NO_WARNINGS 1
  3. #endif

  4. #include <string>
  5. #include <vector>
  6. #include <iostream>
  7. #include <fstream>
  8. #include <boost/foreach.hpp>
  9. #include <boost/lexical_cast.hpp>
  10. #include <boost/algorithm/string.hpp>

  11. // 对应一行的数据
  12. typedef std::vector<int> ResultLineType;
  13. // 所有的行
  14. typedef std::vector<ResultLineType> ResultVectorType;

  15. // 打印结果
  16. void print_result(const ResultVectorType &result_vec)
  17. {
  18.     std::cout << "total line: " << result_vec.size() << std::endl;
  19.     // 一行一行的输出
  20.     for (size_t m = 0; m < result_vec.size(); ++m)
  21.     {
  22.         const ResultLineType &line_vec = result_vec[m];
  23.         // 输出行号,空行也输出行号
  24.         std::cout << "line" << m + 1 << ":\t";
  25.         if (line_vec.empty())
  26.         {
  27.             std::cout << std::endl;
  28.             continue;
  29.         }

  30.         // 遍历一行中的各个数值
  31.         for (size_t n = 0; n < line_vec.size(); ++n)
  32.         {
  33.             std::cout << line_vec[n];
  34.             if (n == line_vec.size() - 1)
  35.                 std::cout << std::endl;
  36.             else
  37.                 std::cout << " ";
  38.         }
  39.     }
  40. }

  41. // ifs 输入
  42. // result_vec 结果
  43. int parse_stream(std::ifstream &ifs, ResultVectorType &result_vec)
  44. {
  45.     // 行数,从1开始
  46.     int line_count = 0;

  47.     // 读到的一行字符串
  48.     std::string line;
  49.     // 字符串去除逗号和空白后的字符串结果集合
  50.     std::vector<std::string> split_vec;
  51.     // 从split_vec转换成的整数结果集合
  52.     ResultLineType result_line;

  53.     // 每次处理一行
  54.     for (;;)
  55.     {
  56.         std::getline(ifs, line);
  57.         if (!ifs.good())
  58.             break;

  59.         ++line_count;
  60.         split_vec.clear();
  61.         result_line.clear();

  62.         // 跳过空行
  63.         if (line.empty())
  64.         {
  65.             result_vec.push_back(result_line);
  66.             continue;
  67.         }

  68.         // 分割字符串
  69.         boost::split(split_vec, line, boost::is_any_of(" ,\r\n"), boost::token_compress_on);
  70.         try
  71.         {
  72.             // 转换成整数
  73.             BOOST_FOREACH (std::string &str, split_vec)
  74.             {
  75.                 int num = boost::lexical_cast<int>(str);
  76.                 result_line.push_back(num);
  77.             }
  78.             // 存入
  79.             result_vec.push_back(result_line);
  80.         }
  81.         catch (const boost::bad_lexical_cast &)
  82.         {
  83.             // 格式错误则中断处理
  84.             std::cerr << "error: file format error, line: " << line_count << std::endl;
  85.             return 3;
  86.         }
  87.     }

  88.     return 0;
  89. }

  90. int main(int argc, char **argv)
  91. {
  92.     if (argc != 2)
  93.     {
  94.         std::cerr << "usage: fl <filepath>" << std::endl;
  95.         return 1;
  96.     }

  97.     // 只读方式打开文件
  98.     std::ifstream ifs(argv[1], std::ios_base::in);
  99.     if (!ifs.good())
  100.     {
  101.         std::cerr << "error: can not read file." << std::endl;
  102.         return 2;
  103.     }

  104.     ResultVectorType result_vec;
  105.     // 处理
  106.     int ret = parse_stream(ifs, result_vec);
  107.     if (ret == 0)
  108.     {
  109.         // 打印结果
  110.         print_result(result_vec);
  111.     }
  112.     ifs.close();

  113.     return ret;
  114. }
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
142 [报告]
发表于 2014-08-26 09:18 |只看该作者
yulihua49 发表于 2014-08-25 15:36
你那个C++函数,很好。
给个建议,文件,就不要给文件名了,直接传fp,这样可以用到stdin,这个可是个重 ...

“如果你认为这个功能很重要,很通用,就把这个函数加到你的应用工具库,以后,在有需要时,一行语句就解决问题。”
按照你的这条理由,汇编也适用吧,你为什么不用汇编来写呢?

代码量的多少,怎么就与适合不适合没有关系呢?
某语言用更少的代码完成同样的工作,我就可以说某语言更适合于这项工作。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
143 [报告]
发表于 2014-08-26 09:56 |只看该作者
本帖最后由 yulihua49 于 2014-08-26 10:23 编辑
noword2k 发表于 2014-08-26 09:18
“如果你认为这个功能很重要,很通用,就把这个函数加到你的应用工具库,以后,在有需要时,一行语句就解 ...

处理字符串,汇编,当然是最合适的了,但是它不适合我,也不适合大多数开发者。
X86的汇编指令,有一大堆串指令,可以极大的提高字符串的处理效率。系统中,部分函数使用了这些指令。可惜,C编译器不完全支持这些指令,那些函数就是用汇编写的,我们使用那些系统函数,就间接的使用了汇编。
如:
loop,loopz,loopnz,movs,loop movs ,translat,。。。。。。。
使用这些指令的另一个好处是原子操作,一个核的指令未完成前,其他核是不能访问同样地址的。


strtok()里就用了一个strchr();
这个strchr,在某些gcc的库里就是用汇编写的。
memset,memcpy里边也发现了汇编的串指令。

我说,C,非常适合处理字符串,还有一个原因,C支持汇编,C程序可以和汇编程序无缝连接,如果一个操作,非常的在意运行效率,你就可以写一个汇编函数,供C调用。
这个函数加入到应用工具库里,成为可重用代码。
缺点是,这个函数不可移植,如果你想在别的CPU上使用,就要按照那个CPU的指令重写。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
144 [报告]
发表于 2014-08-26 10:07 |只看该作者
cobras 发表于 2014-08-25 16:31
进一步改进版。有超长行警告。

那个read_file_line里边的while完全可以不要。

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
145 [报告]
发表于 2014-08-26 11:02 |只看该作者
yulihua49 发表于 2014-08-26 09:56
处理字符串,汇编,当然是最合适的了,但是它不适合我,也不适合大多数开发者。
X86的汇编指令,有一大堆 ...

处理字符串,汇编,当然是最合适的了,但是它不适合我,也不适合大多数开发者。


即不适合你,也不适合大多数开发者?那还合适个毛线啊?

科普哥,你这是语无伦次了吧?

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
146 [报告]
发表于 2014-08-26 11:03 |只看该作者
科普哥加油!弟兄们都看着你呢!

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
147 [报告]
发表于 2014-08-26 11:14 |只看该作者
yulihua49 发表于 2014-08-26 09:56
处理字符串,汇编,当然是最合适的了,但是它不适合我,也不适合大多数开发者。
X86的汇编指令,有一大堆 ...

“处理字符串,汇编,当然是最合适的了,但是它不适合我,也不适合大多数开发者。”
不觉得这句话自相矛盾吗?汇编适用于处理字符串,但是不适用于“大多数开发者”。这是什么无敌逻辑?

谁告诉你汇编指令就是原子操作的?
https://software.intel.com/zh-cn/blogs/2010/01/14/cpucpu
请看第三小节。

执行效率和适用不适用有个毛关系。
最适用于处理字符串的语言是perl,这个没有异议吧。perl的执行效率比C/C++强了?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
148 [报告]
发表于 2014-08-26 13:26 来自手机 |只看该作者
当然要,不要不行。因为将一长行截断处理很大可能结果是错误的。还不如直接跳过。给个警告。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
149 [报告]
发表于 2014-08-26 13:32 来自手机 |只看该作者
适不适合只是建立在个人能力上的观点。对于同个问题,有人用c一小时解决,用python的两小时。因为他擅长c,用python的查手册。这根代码量多少没太大关系。所以对他来说c就是适合的。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
150 [报告]
发表于 2014-08-26 13:35 |只看该作者
本帖最后由 yulihua49 于 2014-08-26 13:47 编辑
fender0107401 发表于 2014-08-26 11:02
即不适合你,也不适合大多数开发者?那还合适个毛线啊?

科普哥,你这是语无伦次了吧?

适合小众,适合系统开发者,他们写了工具,大家用。ok?
我没说perl适不适用。我说C适用。在有些场合,执行效率至关重要。
不说perl适不适用,你能用perl写个g++编译器(这可能问题不大),看看执行效率,就是编译的速度。。。。。。。

某语言,它的程序文本,就是一些个字符串。编译器,就是处理字符串。C适合做编译器,不适合处理字符串?这个,太没有逻辑性了吧?你是否陷入逻辑混乱?
把头脑柃清再发言吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP