免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
11 [报告]
发表于 2014-08-18 16:58 |只看该作者
> 只要是冯.诺依曼 体系的计算机,99.999%的工作,C都可以完成。

这事还跟冯诺依曼有关系???那(1-99.999%)的工作是神马???

> 只有一点点的工作,需要汇编来完成。

到底是那种类型的工作,需要汇编呢?

> 即使是最新的语言,他们的编译器,解释器,虚拟机也都是C写的。
> 当然pascal等也能完成一些,多数还是C做的。

都是C写的???那GNU Octave就是C++写的。。。

用pascal来写编译器神马的???竟然还有虚拟机???

> 如果你想试图用别的,尤其是新型语言来写解释器,一定慢的你目瞪口呆。

看了你的帖子我倒是有点目瞪口呆。。。

> 比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
12 [报告]
发表于 2014-08-19 11:29 |只看该作者
本帖最后由 yulihua49 于 2014-08-19 12:00 编辑
fender0107401 发表于 2014-08-18 16:58
> 只要是冯.诺依曼 体系的计算机,99.999%的工作,C都可以完成。

这事还跟冯诺依曼有关系???那(1-99. ...

pascal也可以写操作系统,早期的WINDOWS就是pascal写的。
我说的是可以。
操作系统底层最核心的部分,是汇编写的。
如终端服务,原子操作,虚存管理等等。
目前,C不能完成的指令:
带进位循环移位,测试并置位,测试并复位。。。。。。。
调用中断,中断返回,开、关中断,管理DMA,管理总线,管理外设,管理辅助CPU。。。。
管态,目态指令。。。。。。

还有许多系统调用,用asm写的。

举个例子:大数计算,用汇编写,性能比C提高几倍。因为涉及进位处理,长字乘除,C是很吃力的。比方,64bit * 64bit = 128bit的长乘,汇编就是一条指令,用C你试试。

这事当然跟计算机的体系有关。如果是达.芬奇计算机,机械计算机,模拟计算机,生物计算机,量子计算机就免谈了。

我是把C和C++看作一体,不与区分的。

“看了你的帖子我倒是有点目瞪口呆。。。”,那说明你需要补课了。
“别扯蛋了,说的汇编是如此的高大上。。。。”,高大上?真是扯淡了。众所周知,汇编是最低级的语言,C也称不上高级。越是低级的语言,越是全面,越高级的语言,越是有局限的。

论坛徽章:
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
13 [报告]
发表于 2014-08-19 12:27 |只看该作者
yulihua49 发表于 2014-08-19 11:29
pascal也可以写操作系统,早期的WINDOWS就是pascal写的。
我说的是可以。
操作系统底层最核心的部分,是 ...


科普哥好威武。

你真牛逼。

加油。

达芬奇。。。跟C语言。。。

论坛徽章:
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
14 [报告]
发表于 2014-08-19 13:04 |只看该作者
仔细看了一下,发现科普哥不是一般的牛逼。

论坛徽章:
0
15 [报告]
发表于 2014-08-19 15:41 |只看该作者
我弄好了,有点乱。咋发个贴变成争论了呀。
while(fgets(line,LINE_MAX,fp)!=NULL)
        {
                //获取字符串长度
                for(i=0;line[i]!=NULL;i++);

                ti=i;
                //找到行中的','
                for(i=0;line[i]!=NULL&&line[i]!=0x2c;i++);
               
                if(i==ti) continue;        //一行中没有','的不处理
                //  一行中只有一个数的去除,也就是一行中没有“,”符号的行是不用的行。
                //printf("%d %s",k,line);

                // 分离出每行中的数字
                p=(char*)line;
                for(;*p!='\0'&&*p==' ';p++);                //去除前面的空格
                for(;*p!='\0'&&*p=='\t';p++);                //去除前面的TAB
                dTab_ct=0;
                err=0;
                memset(dTab,0,sizeof(dTab));
                if((48>*p>57)&&(48>*(p+1)>57))        //如果 line[0]的值不是'0'-'9'
                {
                        printf("\nError: %s",line);
                        continue;  
                }else
                {
                        dTab[dTab_ct][0]=*p-48;                //char 字符转成int整数
                        dTab[dTab_ct][1]=*(p+1)-48;
                        dTab_ct++;
                }
               
                for(i=0;*(p+i)!='\0';i++);                //字符串长度

                pp=(char *)(p+i);
                err=0;
                for(;*p!='\0';p++)
                {
                        if(*p==','&&((p+2)<=pp))
                        {
                                if((48>*(p+1)>57)&&(48>*(p+2)>57))
                                {
                                        err=1;
                                        break;
                                }else
                                {
                                        dTab[dTab_ct][0]=*(p+1)-48;
                                        dTab[dTab_ct][1]=*(p+2)-48;
                                        dTab_ct++;
                                }

                        }
                }
                if(err){printf("\nError %s",line);continue;}
                iTemp=0;
                i1=0;
                i2=0;
               
                for(i=0;i<dTab_ct;i++)
                {
                        // dTab 里就是需要处理的D中的座标
                        iTemp= d[dTab[i][0]][dTab[i][1]]+iTemp;
                        i1=d[dTab[i][0]+1][dTab[i][1]]+i1;
                        i2=d[dTab[i][0]+2][dTab[i][1]]+i2;
                        //printf("%x%x ",dTab[i][0],dTab[i][1]);

                }
                i1=i1%10;
                i2=i2%10;
                iTemp=iTemp%10;
                for(i=0;i<d_ct;i++)
                {
                        d_buf[i][0]='*';
                        d_buf[i][1]='*';
                        d_buf[i][2]='*';
                        d_buf[i][3]='*';
                }
                if(d[0][0]==i1&&d[1][0]==i2)
                {
                        for(i=0;i<dTab_ct;i++)
                        {
                                d_buf[dTab[i][0]][dTab[i][1]] = d[dTab[i][0]][dTab[i][1]]+48;
                        }
                        i=d_ct;
                        while(i)
                        {
                                i--;
                                //printf("\n%c %c %c %c",d_buf[i][0],d_buf[i][1],d_buf[i][2],d_buf[i][3]);
                                printf("\n%d %d %d %d",d[i][0],d[i][1],d[i][2],d[i][3]);
                        }
                        printf("\n%s",line);
                        printf("\nx=%d,%d=%d,%d=%d",iTemp,d[0][0],i1,d[1][0],i2);
                }
                //printf("\n");
                k++;
        }

论坛徽章:
0
16 [报告]
发表于 2014-08-19 15:43 |只看该作者
C的 ASCII码的处理真的很爽哈。

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
17 [报告]
发表于 2014-08-19 15:52 |只看该作者
说的只是易用性吧,其他工具用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
18 [报告]
发表于 2014-08-19 15:55 |只看该作者
本帖最后由 yulihua49 于 2014-08-19 16:05 编辑
tyguaike 发表于 2014-08-19 15:41
我弄好了,有点乱。咋发个贴变成争论了呀。
while(fgets(line,LINE_MAX,fp)!=NULL)
        {

搞的好费劲,不能试试strtok吗?
strtok+atoi,几句话搞定的活。。。。。累死了。

连strlen都要自己弄,可真是原生态啊。
告诉你,系统提供的函数,很多都是内部用汇编写的,速度比你快多了。

你如果真是要展示原生态的技巧,连printf,memset,memcpy也不要用了,自己写。

论坛徽章:
0
19 [报告]
发表于 2014-08-19 16:06 |只看该作者
本帖最后由 tyguaike 于 2014-08-19 16:07 编辑
yulihua49 发表于 2014-08-19 15:55
搞的好费劲,不能试试strtok吗?
strtok+atoi,几句话搞定的活。。。。。累死了。


我用strtok,atoi出错了,不知道为什么,只好自已写了。

论坛徽章:
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
20 [报告]
发表于 2014-08-19 16:14 |只看该作者
本帖最后由 yulihua49 于 2014-08-19 16:19 编辑
tyguaike 发表于 2014-08-19 16:06
我用strtok,atoi出错了,不知道为什么,只好自已写了。

看我的,不是你那个题目,比你复杂,分解每行由'\t'分割的字符串,加入数据库,每个列可能是各种类型,数字,日期,串都有可能:
  1. //加载数据
  2.    char gbkbuf[4096];
  3.    for(i=0;fgets(stmt,sizeof(stmt),xfd);i++) {
  4.              ctx.data=ctx.p=stmt;
  5.         ret=BB_Tree_Count(cols_list,&ctx,fill_cols);//最后的参数是回调函数
  6.          ret=dao->insert(stmt);
  7.         if(ret<0) {
  8.              ShowLog(1,"%s:insert %s fault,i=%d",__FUNCTION__,tabname,i);
  9.              i--;
  10.          }
  11.    }
复制代码
遍历列时的回调函数:
  1. static int fill_cols(T_Tree *bt,void *context)
  2. {
  3. t_node *nodep=(t_node *)bt->Content;
  4. ctx_stu *ctxp=(ctx_stu *)context;
  5. char *cp;
  6. void *rec;
  7.     if(!*ctxp->p) return 0;
  8.     cp=ctxp->p;
  9.     ctxp->p=stptok(ctxp->p,NULL,0,"\t");//用'\t'分割的字符串。
  10.     if(*ctxp->p=='\t') *ctxp->p++=0;
  11.     if(!nodep->tp) return 0;
  12.     ctxp->dp->putOne(cp,nodep->tp);//加入列
  13.     return 1;
  14. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP