免费注册 查看新帖 |

Chinaunix

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

[C] 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
11 [报告]
发表于 2009-09-23 22:42 |只看该作者
原帖由 老陈73 于 2009-9-19 11:18 发表
有人说这事Unix上最标准的做法,但我觉得会不会有问题?
FreeBSD+gcc3.4.2
$FreeBSD: src/lib/libc/string/strcat.c,v 1.7 2002/09/06 11:24:06 tjr Exp $

#include

char *
strcat(char * __restrict ...

这问题貌似简单,实际极其复杂。
我曾因为这个问题,一个程序兜死。
在数据库结果集串行化过程中,90万记录的结果集,fetch出来仅15秒,串行化憋死,就是因为不断的strlen,strcat的结果。
后来改进到保留数据尾指针,避免strcat,结果很快就出来了。

论坛徽章:
0
12 [报告]
发表于 2009-09-24 11:55 |只看该作者
原帖由 微风轻哨 于 2009-9-19 23:33 发表
楼上的函数中调用malloc动态分配内存
1 不可重入
2 系统调用
3 有可能进程切换
4 内存可能泄露,忘记释放。


貌似只要使用malloc就不可避免的涉及到"不可重入"与"系统调用",不过不用这个方法,还真不知道该用什么向堆空间申请内存。难道你有办法?介绍一下。

论坛徽章:
0
13 [报告]
发表于 2009-09-24 18:35 |只看该作者
原帖由 老陈73 于 2009-9-20 08:49 发表


第四项:内存确实没有释放,我就是不知道该在哪里释放,是在函数里面,还是在调用函数的地方?
其他三项不明白,希望解释下


1. malloc不是信号安全的,只是线程安全的,他的内部使用了锁。
2. malloc有自己的内存管理,但如果你想分配的内存超出他的空闲内存时,必须向操作系统请求一块内存,这时候涉及系统调用sbrk(小块内存)或mmap(大块内存)。
3. 向操作系统请求资源,资源不可能总是有的,因此可能将进程休眠,调度其他进程运行。

记得不太清了,都是操作系统的知识。

strcat函数应该在用户层实现,不涉及内核。

论坛徽章:
0
14 [报告]
发表于 2009-09-24 21:41 |只看该作者
sprintf(s + strlen(s), "%s", s1);
这样可行吗?

论坛徽章:
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
15 [报告]
发表于 2009-10-03 23:00 |只看该作者
原帖由 lanying_wzw 于 2009-9-24 21:41 发表
sprintf(s + strlen(s), "%s", s1);
这样可行吗?

p=buf;
for(...) {
     p+=sprintf(p,"......",,,,);
}

完全避免strcat,strlen等低效操作。

论坛徽章:
0
16 [报告]
发表于 2009-10-05 13:01 |只看该作者

回复 #13 微风轻哨 的帖子

考虑用sbrk?      

不应该在strcat内部使用堆分配.
c的一个原则,我感觉是:谁调用了malloc,谁必须释放.否则,设计就可能有问题.

论坛徽章:
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
17 [报告]
发表于 2009-10-06 20:36 |只看该作者
原帖由 peidright 于 2009-10-5 13:01 发表
考虑用sbrk?      

不应该在strcat内部使用堆分配.
c的一个原则,我感觉是:谁调用了malloc,谁必须释放.否则,设计就可能有问题.

这是个一般性原则,有时不得已也得打破。
比如,我封装数据库,做一个SQL函数,返回结果集,确实不知道有多大,只好分配内存,返回指针。但在文档中明确释放空间是你的任务。也可以这么做,再提供一个释放资源的函数专门处理此事。

论坛徽章:
0
18 [报告]
发表于 2009-10-06 21:58 |只看该作者
原帖由 yulihua49 于 2009-10-6 20:36 发表

这是个一般性原则,有时不得已也得打破。
比如,我封装数据库,做一个SQL函数,返回结果集,确实不知道有多大,只好分配内存,返回指针。但在文档中明确释放空间是你的任务。也可以这么做,再提供一个释放资 ...

这是动态分配内存,只有在不用之后才能释放

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
19 [报告]
发表于 2009-10-06 22:40 |只看该作者


  1. char s1[10];
  2. char s2[10];

  3. char s3[100];

  4. int index = 0;
  5. int i = 0;

  6. for (i = 0; i < strlen(s1); ++i) {
  7.   s3[index++] = s1[i];
  8. }

  9. for (i = 0; i < strlen(s2); ++i) {
  10.   s3[index++] = s2[i];
  11. }

  12. s3[index] = 0;

复制代码

论坛徽章:
0
20 [报告]
发表于 2009-10-08 12:45 |只看该作者
原帖由 yulihua49 于 2009-10-3 23:00 发表

p=buf;
for(...) {
     p+=sprintf(p,"......",,,,);
}

完全避免strcat,strlen等低效操作。


明显sprintf更低效
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP