C 标准库 函数 源代码的实现 和 分析
2010-04-11 10:29
435 查看
//库函数实现
char *strcat (char *dst, const char *src)
{
char *p = dst;
while (*p)
p++;
while ((*p++ = *src++))
;
return dst;
}
char *strncat (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
char c;
while (*s1) s1++;
c = '/0';
while (n > 0)
{
c = *s2++;
*s1++ = c;
if (c == '/0')
return dest;
n--;
}
if (c != '/0')
*s1 = '/0';
return dest;
}
char * strcpy (char *d, const char *s)//
{
char *r = d;
while ((*d++ = *s++));
return r;
}
char *strncpy (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
for (; *s2 && n; n--) //n 如果大于s2的长度,则设置0
*s1++ = *s2++;
while (n--)
*s1++ = 0;
return dest;
}
void * memcpy (void *dst, const void *src, long unsigned int n)
{
const char *srcp;
char *dstp;
srcp = src;
dstp = dst;
while (n-- != 0)
*dstp++ = *srcp++;
return dst;
}
void *memmove (void *dst, const void *src, long unsigned int n)
{
const char *srcp;
char *dstp;
srcp = src;
dstp = dst;
if (srcp < dstp)
while (n-- != 0)
dstp
= srcp
;
else
while (n-- != 0)
*dstp++ = *srcp++;
return dst;
}
void *memset (void *dst, int c, long unsigned int n)
{
while (n-- != 0)
n[(char *) dst] = c; // 即 (char*)dst
= c;
return dst;
}
库函数力求简洁,因此存在一定的安全的问题,这是在使用过程中特别注意的地方。也因此VC2005才推出_s的所谓的安全函数。也就是多加了判断位。
比如:
char p1[11] = "0123456789";
char *p2 = &p1[5];
strcat(p1, p2);
或
strncat(p1, p2, 5);
会出现很大问题,死循环导致堆栈溢出而core dump
char *strcat (char *dst, const char *src)
{
char *p = dst;
while (*p)
p++;
while ((*p++ = *src++))
;
return dst;
}
char *strncat (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
char c;
while (*s1) s1++;
c = '/0';
while (n > 0)
{
c = *s2++;
*s1++ = c;
if (c == '/0')
return dest;
n--;
}
if (c != '/0')
*s1 = '/0';
return dest;
}
char * strcpy (char *d, const char *s)//
{
char *r = d;
while ((*d++ = *s++));
return r;
}
char *strncpy (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
for (; *s2 && n; n--) //n 如果大于s2的长度,则设置0
*s1++ = *s2++;
while (n--)
*s1++ = 0;
return dest;
}
void * memcpy (void *dst, const void *src, long unsigned int n)
{
const char *srcp;
char *dstp;
srcp = src;
dstp = dst;
while (n-- != 0)
*dstp++ = *srcp++;
return dst;
}
void *memmove (void *dst, const void *src, long unsigned int n)
{
const char *srcp;
char *dstp;
srcp = src;
dstp = dst;
if (srcp < dstp)
while (n-- != 0)
dstp
= srcp
;
else
while (n-- != 0)
*dstp++ = *srcp++;
return dst;
}
void *memset (void *dst, int c, long unsigned int n)
{
while (n-- != 0)
n[(char *) dst] = c; // 即 (char*)dst
= c;
return dst;
}
库函数力求简洁,因此存在一定的安全的问题,这是在使用过程中特别注意的地方。也因此VC2005才推出_s的所谓的安全函数。也就是多加了判断位。
比如:
char p1[11] = "0123456789";
char *p2 = &p1[5];
strcat(p1, p2);
或
strncat(p1, p2, 5);
会出现很大问题,死循环导致堆栈溢出而core dump
相关文章推荐
- IPVS源代码分析----发送函数的实现
- 调用malloc()函数之后,内核发生了什么?附malloc()和free()实现的源代码
- linux-0.11调试教程,fflush()函数实现分析和FILE类型定义
- 通过分析 JDK 源代码研究 TreeMap 红黑树算法实现
- BlogEngine.Net架构与源代码分析系列part3:数据存储——基于Provider模式的实现
- JavaScript实现对象克隆函数clone( )的程序及分析
- 【转】[转]C语言可变参数函数分析与实现
- gcc源代码分析之gen_call_value()函数
- gcc源代码分析,end_final()函数把insn转化成汇编代码
- 转:strcmp函数实现及分析
- GetProcAddress函数实现和分析
- C打印函数printf的一种实现原理简要分析
- [C/C++标准库]_[初级]_[如何实现std::string自己的Format(sprintf)函数]
- 使用Oracle 分析函数RANK()实现查询库存中每类物资最新N条记录
- Oracle 使用分析函数实现小计合计
- 用session实现购物车(含设计分析及源代码)part1
- gcc源代码分析,finish_decl ()函数和push_parm_decl ()函数分析
- google PLDA + 实现原理及源代码分析
- Oracle over()分析函数实现累加
- Berkeley DB 源代码分析 (3) --- Btree的实现 (2)