免费注册 查看新帖 |

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
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
14 [报告]
发表于 2009-09-24 21:41 |只看该作者
sprintf(s + strlen(s), "%s", s1);
这样可行吗?

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


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


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

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

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

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


貌似只要使用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
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,结果很快就出来了。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00
10 [报告]
发表于 2009-09-20 08:49 |只看该作者
原帖由 微风轻哨 于 2009-9-19 23:33 发表
楼上的函数中调用malloc动态分配内存
1 不可重入
2 系统调用
3 有可能进程切换
4 内存可能泄露,忘记释放。


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

论坛徽章:
0
9 [报告]
发表于 2009-09-20 00:44 |只看该作者
通常说来,C 假定程序员具有自理能力。像预先控制好缓冲区大小一类的事,C 程序员应该是驾轻就熟的。
所以,strcat(dest, src); 这样的用法应该是常态。
如果你实在担心,倒是可以用 strncat(),或者 strlcat()。

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

[ 本帖最后由 微风轻哨 于 2009-9-19 23:35 编辑 ]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00
7 [报告]
发表于 2009-09-19 15:17 |只看该作者

我自己写了个连接字符串的方法,大家看看

执行是肯定能执行,已经测试过了,但不知道有没有效率更高的方法?
另外,free应该放在什么地方?是在调用连接字符串的函数后,还是可以放在函数里面?
//字符串连接字符串
  2 char * StringLianjie(char *s1,char *s2){
  3         int i=strlen(s1);//StringLength(s1);
  4         int j=strlen(s2);//StringLength(s2);
  5         char *pc=(char *)malloc(i+j+1);
  6         char *pc1;
  7         pc1=pc;
  8         while((*pc++=*s1++)!='\0');
  9         pc--;
10         while((*pc++=*s2++)!='\0');
11         return pc1;
12 }

论坛徽章:
0
6 [报告]
发表于 2009-09-19 13:00 |只看该作者
原帖由 老陈73 于 2009-9-18 19: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 ...

尺有所短,寸有所长
哪里有最好。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP