Programming 版 (精华区)
发信人: OGG (提心吊胆), 信区: Programming
标 题: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 17:33:59 2005), 站内
strcat(), 字符串的连接.
char *strcat(char *target,const char *source)
{
char *original=target;
while(*target) target++; // Find the end of the string
while(*target++=*source++);
return(original);
}
要是真这样,那不就把target后面的数据覆盖了.......
--
雄关漫道真如铁
而今迈步从头跃
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 218.9.185.19]
────────────────────────────────────────
pangwa (dream my dream) 于 (Fri Jul 8 17:40:53 2005) 说道:
应该就是这样的吧
strcat,strcpy本来就不是很安全的
发信人: artist (瀚峯), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 17:48:33 2005), 转信
该函数很简洁。安全要程序员自己考虑。
否则怎么办? target另申请空间? 可能会带来更多的问题。
请各位发表高论。
【 在 OGG (提心吊胆) 的大作中提到: 】
: strcat(), 字符串的连接.
: char *strcat(char *target,const char *source)
: {
: ...................
--
The most valuable thing is freedom.
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.143]
发信人: SwordLea (飞刀李), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 18:04:31 2005), 转信
我这里有 borland 版本的strcat
/*-----------------------------------------------------------------------*
* filename - strcat.c
*
* function(s)
* strcat - appends one string to another
*-----------------------------------------------------------------------*/
/*
* C/C++ Run Time Library - Version 5.0
*
* Copyright (c) 1987, 1992 by Borland International
* All Rights Reserved.
*
*/
#pragma inline
#include <asmrules.h>
#include <string.h>
/*---------------------------------------------------------------------*
Name strcat - appends one string to another
Usage char *strcat(char *destin, const char *source);
Prototype in string.h
Description strcat appends a copy of source to the end of destin. The
length of the resulting string is strlen(destin) +
strlen(source).
Return value returns a pointer dest
*---------------------------------------------------------------------*/
#undef strcat /* not an intrinsic */
#if defined(__FARFUNCS__)
#include <_farfunc.h>
#endif
char *_CType _FARFUNC strcat(register char *dest, const char *src)
{
SaveSI
SaveDI
asm cld
#if defined(__LARGE__) || defined(__COMPACT__)
asm push ds
#endif
#if LDATA
asm les di, dest /* es:di = dest */
#else
asm mov di, dest /* es:di = dest */
asm push ds
asm pop es
#endif
asm mov dx, di /* save dest offset in dx */
asm xor al, al
asm mov cx, -1 /* find end of dest */
asm repne scasb
#if LDATA
asm push es
#endif
asm lea si,[di-1] /* es:si points to terminating null in dest */
asm LES_ di, src
asm mov cx,-1 /* figure out strlen(src) */
asm repne scasb
asm not cx /* CX = strlen(src) + 1 */
asm sub di,cx /* point es:di back to start of src */
#if LDATA
asm push es
asm pop ds /* set DS: to seg of src */
asm pop es /* restore ES: as seg of dest */
#endif
asm xchg si, di /* DS:SI = src, ES:DI = dest+strlen(dest) */
asm test si,1 /* odd src? */
asm jz move_rest
asm movsb /* move a byte to make src even */
asm dec cx
move_rest:
asm shr cx, 1
asm rep movsw
asm jnc move_last
asm movsb
move_last:
asm xchg ax, dx /* return addr of string */
#if LDATA
asm mov dx, es
#endif
#if defined(__LARGE__) || defined(__COMPACT__)
asm pop ds
#endif
#if LDATA
return( (char *)(MK_LONG) );
#else
return( (char *)_AX );
#endif
}
【 在 OGG (提心吊胆) 的大作中提到: 】
: strcat(), 字符串的连接.
: char *strcat(char *target,const char *source)
: {
: ...................
--
俺是个原始人,喜欢到处穷溜达。有天逛到一个黑不溜秋的地方,觉得很气闷,就说了句“要有光!”然后大爆炸就开始了,时间就产生了,宇宙就初具规模了……
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.224.2]
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.246.244]
发信人: worldguy (稀里糊涂), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 19:53:50 2005), 转信
这些库函数的源代码在哪能找到?
【 在 SwordLea (飞刀李) 的大作中提到: 】
: 我这里有 borland 版本的strcat
: /*-----------------------------------------------------------------------*
: * filename - strcat.c
: ...................
--
+--+--+--+--+--+--+--+--+--+--+
|十|酒|八|七|六|五|四|三|二|一|
|分|薄|分|分|欲|谷|季|餐|目|贯|
|坦|烟|交|忍|不|皆|不|有|远|知|
|荡|断|往|让|张|食|懒|节|眺|足|
+--+--+--+--+--+--+--+--+--+--+
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.250.16]
发信人: iamxiaohan (xieyubo.cn), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 20:22:45 2005), 转信
一般编译器的安装目录下都有
【 在 worldguy (稀里糊涂) 的大作中提到: 】
: 这些库函数的源代码在哪能找到?
--
xieyubo@gmail.com
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.236.219]
发信人: cos (COS), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: BBS 哈工大紫丁香站 (Fri Jul 8 20:23:11 2005)
垃圾?你写个?
strcat本来就是要这么干的。
【 在 OGG (提心吊胆) 的大作中提到: 】
: strcat(), 字符串的连接.
: char *strcat(char *target,const char *source)
: {
: char *original=target;
: while(*target) target++; // Find the end of the string
: while(*target++=*source++);
: return(original);
: }
: ...................
--
※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 218.9.120.*]
发信人: iamxiaohan (xieyubo.cn), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 20:30:02 2005), 转信
strcat最多只是一个功能描述,具体实现没有谁规定它必须怎样干
【 在 cos (COS) 的大作中提到: 】
: 垃圾?你写个?
: strcat本来就是要这么干的。
--
xieyubo@gmail.com
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.236.219]
发信人: cos (COS), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: BBS 哈工大紫丁香站 (Fri Jul 8 20:31:57 2005)
strcat描述了字符串地址是不被改变的。
那么,有办法在不覆盖后面内容的情况下,strcat么?
不这么干,还能怎么干?
【 在 iamxiaohan (xieyubo.cn) 的大作中提到: 】
: strcat最多只是一个功能描述,具体实现没有谁规定它必须怎样干
--
※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 218.9.120.*]
发信人: iamxiaohan (xieyubo.cn), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 20:33:27 2005), 转信
你可以自己写
【 在 cos (COS) 的大作中提到: 】
: strcat描述了字符串地址是不被改变的。
: 那么,有办法在不覆盖后面内容的情况下,strcat么?
: 不这么干,还能怎么干?
: ...................
--
xieyubo@gmail.com
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.236.219]
发信人: cos (COS), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: BBS 哈工大紫丁香站 (Fri Jul 8 20:37:40 2005)
谁写,也之后是在源串后面直接加。都得覆盖咯
【 在 iamxiaohan (xieyubo.cn) 的大作中提到: 】
: 你可以自己写
--
※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 218.9.120.*]
发信人: OGG (提心吊胆), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 21:26:03 2005), 站内
看了一下,好像就是直接覆盖后面吧
asm mov di, dest /* es:di = dest */
asm push ds
asm pop es
asm mov dx, di /* save dest offset in dx */
asm xor al, al
asm mov cx, -1 /* find end of dest */
asm repne scasb
asm lea si,[di-1] /* es:si points to terminating null in dest */
可是有时候并不会出错,
int main(int argc, char *argv[])
{
char str1[] = "Hello";
char str2[] = "fuck";
char str3[] = "world";
printf("str1 is:%s\n",str1);
strcat(str1,str3);
printf("str1 is:%s\n",str1);
printf("str2 is:%s\n",str2);
printf("str3 is:%s\n",str3);
return 0;
}
中str2就不会被覆盖,难道是编译器给优化了?...
【 在 SwordLea (飞刀李) 的大作中提到: 】
: 我这里有 borland 版本的strcat
: /*-----------------------------------------------------------------------*
: * filename - strcat.c
: ...................
--
雄关漫道真如铁
而今迈步从头跃
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 218.9.185.19]
发信人: cos (COS), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: BBS 哈工大紫丁香站 (Fri Jul 8 22:14:52 2005)
1.it's up to the user to get src str have enough space to contain src+dest.
2.str2 does NOT necessarily follow str1.
【 在 OGG (提心吊胆) 的大作中提到: 】
: 看了一下,好像就是直接覆盖后面吧
: asm mov di, dest /* es:di = dest */
: asm push ds
: asm pop es
: asm mov dx, di /* save dest offset in dx */
: asm xor al, al
: asm mov cx, -1 /* find end of dest */
: asm repne scasb
: ...................
--
※ 修改:·cos 於 Jul 8 22:17:47 2005 修改本文·[FROM: 218.9.120.*]
※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 218.9.120.*]
发信人: OGG (提心吊胆), 信区: Programming
标 题: Re: 在网上看的strcat代码,不知道是不是真的,太垃圾了..
发信站: 哈工大紫丁香 (Fri Jul 8 22:20:50 2005), 站内
我终于弄明白了
gcc什么优化都没作,它只是把str1放在高处str2低一点,str3再低一点
例如
str1:0xbfffe640
str2:0xbfffe638
str3:0xbfffe620
哈哈,唬的我一愣一愣的,现在在str1前面又加了一个str0
这回就有覆盖了,哈
【 在 cos (COS) 的大作中提到: 】
: 1.it's up to the user to let src str have enough space to contain src+dest.
: 2.str2 does NOT necessarily follow str1.
--
雄关漫道真如铁
而今迈步从头跃
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 218.9.185.19]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:203.252毫秒