免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
131 [报告]
发表于 2014-08-25 13:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
132 [报告]
发表于 2014-08-25 13:22 |只看该作者
__BlueGuy_ 发表于 2014-08-25 13:20
发飙了么?


你就是个“逗逼”。

天天在CU刷存在感的“逗逼”。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
133 [报告]
发表于 2014-08-25 13:26 |只看该作者
改版,更符合题目的要求。加入提示信息。

  1. /* linsplit.c */

  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>

  5. #define MAX_LINE      256
  6. #define FILE_PATH "data/data.txt"

  7. int nstr_len(const char *s, int lmt)
  8. {
  9.         int i;

  10.         for (i = 0; i < lmt && s[i] != '\0'; ++i) {
  11.         }
  12.         return i;
  13. }

  14. int read_file_line(FILE *fp, char *buf, int buf_len)
  15. {
  16.         int len;

  17.         while (fgets(buf, buf_len, fp) != NULL) {
  18.                 len = nstr_len(buf, buf_len);
  19.                 if (len > 0 && buf[len - 1] == '\n') {
  20.                         return 0;
  21.                 }
  22.                 return -2; /* error: buffer two small */
  23.         }
  24.         return -1; /* error: file end */
  25. }

  26. int line_splite(const char *file, int *o_tab, int tab_len)
  27. {
  28.         char buf[MAX_LINE];
  29.         char *p, *np;
  30.         FILE *fp;
  31.         int data;
  32.         int i;
  33.         int retval;

  34.         fp = fopen(file, "r");
  35.         if (fp != NULL) {
  36.                 i = 0;
  37.                 while ((retval = read_file_line(fp, buf, MAX_LINE)) != -1) {
  38.                         if (retval == -2) {
  39.                                 if (o_tab == NULL) {
  40.                                         puts("error: line too long, skip this line");
  41.                                 }
  42.                                 while ((retval = read_file_line(fp, buf, MAX_LINE)) == -2);
  43.                                 if (retval == -1) {
  44.                                         break;
  45.                                 }
  46.                         }else {
  47.                                 p = strtok(buf, ",\n");
  48.                                 if (p != NULL) {
  49.                                         do {
  50.                                                 np = p;
  51.                                                 data = strtol(p, &np, 10);
  52.                                                 if (p != np) {
  53.                                                         if (i < tab_len && o_tab != NULL) {
  54.                                                                 o_tab[i] = data;
  55.                                                         }
  56.                                                         ++i;
  57.                                                 }
  58.                                         }while ((p = strtok(NULL, ",\n")) != NULL);
  59.                                 }
  60.                         }
  61.                 }
  62.                 fclose(fp);
  63.                 return i;
  64.         }
  65.         return -1;
  66. }

  67. int main(int argc, const char *argv[])
  68. {
  69.         const char *file;
  70.         int *data;
  71.         int cnt;
  72.         int i;

  73.         if (argc > 1) {
  74.                 file = argv[1];
  75.         }else {
  76.                 file = FILE_PATH;
  77.                 puts("no file, use default.");
  78.         }
  79.         printf("open file \"%s\".\n", file);
  80.         printf("max line buffer: %d\n", MAX_LINE);
  81.         cnt = line_splite(file, NULL, 0);
  82.         if (cnt != -1) {
  83.                 data = (int *)malloc(cnt * sizeof(int));
  84.                 if (data != NULL) {
  85.                         line_splite(file, data, cnt);
  86.                         printf("list all %d number(s):\n", cnt);
  87.                         for (i = 0; i < cnt; ++i) {
  88.                                 printf("    %d: %d\n", i, data[i]);
  89.                         }
  90.                         free(data);
  91.                         return 0;
  92.                 }else {
  93.                         puts("error: no memory");
  94.                 }
  95.         }else {
  96.                 puts("error: can't open file");
  97.         }
  98.         return -1;
  99. }
复制代码

论坛徽章:
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
134 [报告]
发表于 2014-08-25 15:36 |只看该作者
本帖最后由 yulihua49 于 2014-08-25 16:07 编辑
noword2k 发表于 2014-08-25 11:09
题目是,写一个函数,要求输入文件名,解析里面的以逗号分割,不定行数、列数的数字,返回一个数组。
你 ...

你那个C++函数,很好。
给个建议,文件,就不要给文件名了,直接传fp,这样可以用到stdin,这个可是个重要资源哦!
看:static int insert_a_table(T_SQL_Connect *db_conn,FILE *xfd,char *tabname,int param_ver)
当时我们那个xfd就来自stdin,sidin又是由另一个脚本程序解析xml得来的。你看,我也是不反对用脚本程序的。
为了多线程应用,strtok改strtok_r,这样就完美了。
最后,如果你认为这个功能很重要,很通用,就把这个函数加到你的应用工具库,以后,在有需要时,一行语句就解决问题,比python行数少了吧?

前边54楼,我给你的那个数据库泛型的例子,100多行,其实它后边的工具库,上万行。但是这个上万行(大量的字符串处理,正则表达式什么的),不是每次都要写的,在N年前写完了它,以后用的时候,就没有几行语句了。
而且在应用的层面上,概念简单,逻辑清晰。
因此,得不出C/C++不适合处理XX问题的结论,它依然是适合处理的。

代码量的多少,与适合不适合没有关系。
有时,100行的代码,概念清晰,也好写,也好读。10行的代码,逻辑晦涩,照样读不懂。

论坛徽章:
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
135 [报告]
发表于 2014-08-25 16:03 |只看该作者
cobras 发表于 2014-08-25 13:26
改版,更符合题目的要求。加入提示信息。

read_file_line
狗熊掰棒子了,都给读出来了,就返回了最后一行?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
136 [报告]
发表于 2014-08-25 16:29 |只看该作者
yulihua49 发表于 2014-08-25 16:03
read_file_line
狗熊掰棒子了,都给读出来了,就返回了最后一行?

read_file_line的功能看自己怎么用。我的通常做法是跳过超长的文本行不处理。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
137 [报告]
发表于 2014-08-25 16:30 |只看该作者
致于线程安全不在考虑范围。因为这只是个例子。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
138 [报告]
发表于 2014-08-25 16:31 |只看该作者
进一步改进版。有超长行警告。

  1. /* linsplit.c */

  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>

  5. #define MAX_LINE      256
  6. #define FILE_PATH "data/data.txt"

  7. int read_file_line(FILE *fp, char *buf, int buf_len)
  8. {
  9.         int len;

  10.         while (fgets(buf, buf_len, fp) != NULL) {
  11.                 len = strlen(buf);
  12.                 if (len > 0 && buf[len - 1] == '\n' || feof(fp)) {
  13.                         return 0;
  14.                 }
  15.                 return -2; /* error: buffer two small */
  16.         }
  17.         return -1; /* error: file end */
  18. }

  19. int line_splite(const char *file, int *o_tab, int tab_len, int *o_count)
  20. {
  21.         char buf[MAX_LINE];
  22.         char *p, *np;
  23.         FILE *fp;
  24.         int data;
  25.         int i;
  26.         int retval;
  27.         int overflow;

  28.         fp = fopen(file, "r");
  29.         if (fp != NULL) {
  30.                 i = 0;
  31.                 overflow = 0;
  32.                 while ((retval = read_file_line(fp, buf, MAX_LINE)) != -1) {
  33.                         if (retval == -2) {
  34.                                 ++overflow;
  35.                                 while ((retval = read_file_line(fp, buf, MAX_LINE)) == -2) {
  36.                                 }
  37.                         }else {
  38.                                 if ((p = strtok(buf, ",\n")) != NULL) {
  39.                                         do {
  40.                                                 np = p;
  41.                                                 data = strtol(p, &np, 10);
  42.                                                 if (p != np) {
  43.                                                         if (i < tab_len && o_tab != NULL) {
  44.                                                                 o_tab[i] = data;
  45.                                                         }
  46.                                                         ++i;
  47.                                                 }
  48.                                         }while ((p = strtok(NULL, ",\n")) != NULL);
  49.                                 }
  50.                         }
  51.                 }
  52.                 fclose(fp);
  53.                 if (o_count != NULL) {
  54.                         *o_count = i;
  55.                 }
  56.                 return overflow;
  57.         }
  58.         return -1; /* error: file not found */
  59. }

  60. int main(int argc, const char *argv[])
  61. {
  62.         const char *file;
  63.         int *data;
  64.         int cnt;
  65.         int i;
  66.         int retval;

  67.         if (argc > 1) {
  68.                 file = argv[1];
  69.         }else {
  70.                 file = FILE_PATH;
  71.                 puts("not specify, use default file.");
  72.         }
  73.         printf("open file \"%s\" (max line: %d).\n", file, MAX_LINE - 1);
  74.         if ((retval = line_splite(file, NULL, 0, &cnt)) != -1) {
  75.                 if (retval) {
  76.                         printf("warning: skip exceed %d line(s)\n", retval);
  77.                 }
  78.                 if ((data = (int *)malloc(cnt * sizeof(int))) != NULL) {
  79.                         line_splite(file, data, cnt, NULL);
  80.                         printf("get %d number(s). list all:\n", cnt);
  81.                         for (i = 0; i < cnt; ++i) {
  82.                                 printf("  %d: %d\n", i, data[i]);
  83.                         }
  84.                         free(data);
  85.                         return 0;
  86.                 }else {
  87.                         puts("error: no memory");
  88.                 }
  89.         }else {
  90.                 puts("error: can't open file");
  91.         }
  92.         return -1;
  93. }
复制代码

论坛徽章:
35
双子座
日期:2014-05-09 17:56:38程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:0015-16赛季CBA联赛之山西
日期:2016-02-20 10:54:41
139 [报告]
发表于 2014-08-25 19:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
140 [报告]
发表于 2014-08-25 21:40 |只看该作者
大家都很无聊啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP