免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 63983 | 回复: 33
打印 上一主题 下一主题

[C] C语言连接两个字符串最好的方法是什么? [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-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 <string.h>

char *
strcat(char * __restrict s, const char * __restrict append)
{
char *save = s;

for (; *s; ++s);
while ((*s++ = *append++));
return(save);
}
       
按照这种做法,如果在char *svae结束后的内存中有数据,是不是就被覆盖了?

论坛徽章:
0
2 [报告]
发表于 2009-09-19 12:11 |只看该作者
会覆盖char* save指向的字符串之后的数据区,所以在调用strcat(s,append)之前,必须保证指针s所指向的区域足够大,至少要能够容纳得下append所指向的那个字符串

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00
3 [报告]
发表于 2009-09-19 12:15 |只看该作者
原帖由 重开地水火风 于 2009-9-19 12:11 发表
会覆盖char* save指向的字符串之后的数据区,所以在调用strcat(s,append)之前,必须保证指针s所指向的区域足够大,至少要能够容纳得下append所指向的那个字符串

如果是这样,C语言连接两个字符串最好的方式是什么?

论坛徽章:
0
4 [报告]
发表于 2009-09-19 12:28 |只看该作者
我觉得,好坏,先得有个标准,比如优先考虑调用者方便,如此,strcat很方便

论坛徽章:
0
5 [报告]
发表于 2009-09-19 12:31 |只看该作者
strlen(str1) 知道是多少吧。
strlen(str2) 知道是多少吧。
strlen(strcat(str1, str2)) 是多少也就知道了吧。

自己考虑缓冲区容量的问题。

论坛徽章:
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 ...

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

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

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

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

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


第四项:内存确实没有释放,我就是不知道该在哪里释放,是在函数里面,还是在调用函数的地方?
其他三项不明白,希望解释下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP