免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
51 [报告]
发表于 2014-08-20 14:35 |只看该作者
yulihua49 发表于 2014-08-20 14:07
对不起,我经常把它们搞混,甚至在一个程序里都混着写。
你看20楼。看起来是C的,一不小心里边有一个C++ ...


csv格式直接读取就可以了

  1. import csv

  2. csv.DictReader(open(name), delimiter="\t")
复制代码
你的程序不完不整,那些自定义的t_node,ctx_stu是什么玩意儿?里面的实现呢?
把能完整工作的程序贴出来,要刷几屏?

再说,LZ在问1+1等于几,你回答说这个太简单了,我以前做过2+3等于5。是不是很搞笑?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
52 [报告]
发表于 2014-08-20 14:37 |只看该作者
yulihua49 发表于 2014-08-20 14:30
YACC是造好的轮子,不用你造。
它强大的字符串处理能力,没有谁能比得了。


那你认为造好的轮子好用,还是从头搞好用?

用脚本语言处理此类问题就是使用造好的轮子。

论坛徽章:
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
53 [报告]
发表于 2014-08-20 14:42 |只看该作者
zhaohongjian000 发表于 2014-08-20 14:37
那你认为造好的轮子好用,还是从头搞好用?

用脚本语言处理此类问题就是使用造好的轮子。

看50楼。

论坛徽章:
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
54 [报告]
发表于 2014-08-20 14:47 |只看该作者
本帖最后由 yulihua49 于 2014-08-20 14:58 编辑
noword2k 发表于 2014-08-20 14:35
csv格式直接读取就可以了你的程序不完不整,那些自定义的t_node,ctx_stu是什么玩意儿?里面的实现呢? ...

大约212行,含注释。
这个是C++的泛型处理,内部涉及大量的字符串处理。
分割字符串就几句话。
  1. #include <sdbcdao.hpp>
  2. #include <tree.h>


  3. #define beginTransaction(db_conn_)  ___SQL_Transaction__((db_conn_),TRANBEGIN)
  4. #define commitTransaction(db_conn_)  ___SQL_Transaction__((db_conn_),TRANCOMMIT)
  5. #define rollbackTransaction(db_conn_)  ___SQL_Transaction__((db_conn_),TRANROLLBACK)

  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif

  9. void uconv_free(void);
  10. int utf8togbk(const char *sourcebuf, size_t sourcelen, char *destbuf, size_t destlen);

  11. #ifdef __cplusplus
  12. }
  13. #endif

  14. typedef struct  {
  15.     SdbcDAO *dp;
  16.     char *data,*p;
  17. } ctx_stu;

  18. typedef struct {
  19.     int n;
  20.     T_PkgType *tp;
  21. } t_node;

  22. static int node_cmp(void *s,void *d,int len)
  23. {
  24. t_node *sp=(t_node *)s;
  25. t_node *dp=(t_node *)d;
  26.     return sp->n - dp->n;
  27. }
  28. static int fill_cols(T_Tree *bt,void *context)
  29. {
  30. t_node *nodep=(t_node *)bt->Content;
  31. ctx_stu *ctxp=(ctx_stu *)context;
  32. char *cp;
  33. void *rec;
  34.     if(!*ctxp->p) return 0;
  35.     cp=ctxp->p;
  36.     ctxp->p=stptok(ctxp->p,NULL,0,"\t");
  37.     if(*ctxp->p=='\t') *ctxp->p++=0;
  38.     if(!nodep->tp) return 0;
  39.     ctxp->dp->putOne(cp,nodep->tp);
  40.     return 1;
  41. }

  42. static int has_cc(char *str)
  43. {
  44. char *p=str;
  45.     while(*p) {
  46.         if(*p & 128) return 1;
  47.         p++;
  48.     }
  49.     return 0;
  50. }

  51. //插入一个表
  52. static int insert_a_table(T_SQL_Connect *db_conn,FILE *xfd,char *tabname,int param_ver)
  53. {
  54. char cols[4096],stmt[4096],*p,*savep;
  55. int ret,i,n;
  56. t_node node;
  57. ctx_stu ctx;
  58. T_Tree *cols_list=NULL;
  59. SdbcDAO *dao;
  60. //取出表名、列名
  61.     if(NULL==fgets(cols,sizeof(cols),xfd)) {
  62.           ShowLog(1,"%s:%s 没有数据!",__FUNCTION__,tabname);
  63.           return -1;
  64.     }
  65.     tabname=strtok_r(cols," ",&savep);
  66.     if(!tabname) {
  67.           ShowLog(1,"%s: tabname is emypt!",__FUNCTION__);
  68.           return -1;
  69.     }
  70.      
  71.     strupper(tabname);
  72.     try {
  73.         dao=new SdbcDAO(db_conn,tabname);
  74.     } catch( ... ) {
  75.           ShowLog(1,"%s:%s Table not found!",__FUNCTION__,tabname);
  76.           return -2;
  77.     }
  78.     dao->Data_init();
  79. //删除重复记录
  80.     //因为类型不明,一律转换成char
  81.     itoStr(param_ver,stmt);
  82.     ret=dao->putOne(stmt,"parameter_ver");
  83.     if(ret<0) {
  84.         ShowLog(1,"%s:column parameter_ver not found!",__FUNCTION__);
  85.         return -3;
  86.     }
  87.     mk_where("parameter_ver",stmt);
  88.     ret=dao->Delete(stmt);
  89.     ShowLog(5,"%s:stmt=%s,ret=%d",__FUNCTION__,stmt,ret);

  90.     ctx.dp=dao;
  91.     node.n=0;
  92. //生成加载列名表
  93.     while(NULL != (p=strtok_r(NULL,",",&savep))) {
  94.         if((255&*p) <= ' ') break;
  95.         node.tp=dao->getTemplate(p);
  96.         if(!node.tp) { //这个列的数据将被跳过
  97.           ShowLog(1,"%s:%s column [%s] not found!",__FUNCTION__,tabname,p);
  98.         }
  99.         node.n++;
  100.         cols_list=BB_Tree_Add(cols_list,&node,sizeof(node),node_cmp,NULL);
  101.     }
  102. //加载数据
  103.     char gbkbuf[4096];
  104.     for(i=0;fgets(stmt,sizeof(stmt),xfd);i++) {
  105.         if(has_cc(stmt)) {
  106.             ret=utf8togbk(stmt, sizeof(stmt), gbkbuf, sizeof(gbkbuf));
  107.             ctx.data=ctx.p=gbkbuf;
  108.         } else {
  109.             ctx.data=ctx.p=stmt;
  110.         }
  111.         ret=BB_Tree_Count(cols_list,&ctx,fill_cols);
  112.         ret=dao->insert(stmt);
  113.         if(ret<0) {
  114.             ShowLog(1,"%s:insert %s fault,i=%d",__FUNCTION__,tabname,i);
  115.             i--;
  116.         }
  117.     }

  118.     BB_Tree_Free(&cols_list,NULL);
  119.     delete dao;
  120.     return i;
  121. }
复制代码
111行就是二叉树用作动态数组。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
55 [报告]
发表于 2014-08-20 14:49 |只看该作者
yulihua49 发表于 2014-08-20 14:42
看50楼。


说白了,你也承认这种任务并不适合直接用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
56 [报告]
发表于 2014-08-20 14:54 |只看该作者
zhaohongjian000 发表于 2014-08-20 14:49
说白了,你也承认这种任务并不适合直接用C语言来处理。

你没看明白还是我没说明白。

虽然多用几行代码,并不说明C不擅长。。。。。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
57 [报告]
发表于 2014-08-20 14:57 |只看该作者
yulihua49 发表于 2014-08-20 14:47
大约212行,含注释。
这个是C++的泛型处理,内部涉及大量的字符串处理。
分割字符串就几句话。

不用比了吧,你很自豪的实现,在python里根本不是什么事。
200多行C程序,python 估计20行就解决了。

论坛徽章:
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
58 [报告]
发表于 2014-08-20 15:00 |只看该作者
本帖最后由 yulihua49 于 2014-08-20 15:07 编辑
noword2k 发表于 2014-08-20 14:57
不用比了吧,你很自豪的实现,在python里根本不是什么事。
200多行C程序,python 估计20行就解决了。


光数据库的一个表的解析就够你写几页的。
就两句话的分析字符串,用python,剩下要入数据库呢,我找谁去?
内里的函数,长篇大论的处理字符串:解析、重组,查找(包括正则),替换都找python?效率找谁说去?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
59 [报告]
发表于 2014-08-20 15:00 |只看该作者
yulihua49 发表于 2014-08-20 14:54
你没看明白还是我没说明白。

虽然多用几行代码,并不说明C不擅长。。。。。


那我只能说你和我理解的 擅长与否 不同,在我看来“擅长”包含“方便使用”。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
60 [报告]
发表于 2014-08-20 15:05 |只看该作者
yulihua49 发表于 2014-08-20 15:00
光数据库的一个表的解析就够你写几页的。

你除了C/C++还会什么语言?你的自信来自何处?
连用都没用过,就自认自己所使用的语言是最好的,在99%的情形下适用,未免太狭隘了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP