您的位置:首页 > 编程语言 > C语言/C++

C语言标准库常见函数的内部实现

2015-10-21 10:37 567 查看
1.从 C标准库 这本书中摘抄。http://book.douban.com/subject/3775842/

2.

1)memset

概述

#include <string.h>

void *memset(void *s,int c,size_t n);

说明:

函数memset把c(转换成unsigned char类型)的值复制到s指向的对象的前n个字符的每个字符中。

返回值:

函数memset返回s的值

函数实现:

/* memset function */
#include <string.h>

void *memset(void *s,int c,size_t n)
{
const unsigned char uc=c;
unsigned char *su;

for(su=s;0<n;++su,--n)
*su=uc;

return s;
}


2) memcpy

概述

#include <string.h>

void *memcpy(void *s1,const void *s2,size_t n);

说明

函数memcpy从s2指向的对象中复制n个字符到s1指向的对象中。如果复制发生在两个重叠的对象中,则这种行为未定义。

返回值

函数memcpy返回s1的值。

函数实现:

#include <string.h>

void *memcpy(void *s1,const void *s2,size_t n)
{
char *su1;
const char *su2;

for(su1=s1,su2=s2;0<n;++su1,++su2,--n)
*su1=*su2;

return s1;

}


3)memmove

概述

#include <string.h>

void *memmove(void *s1,const void *s2,size_t n);

说明

函数memmove从s2指向的对象中复制n个字符到s1指向的对象中。复制看上去就像先把n个字符从s2指向的对象复制到一个n个字符的临时数组中,这个临时数组看上去和s1 s2指向的对象都不重叠,然后再把这n个字符从临时数组中复制到s1指向的对象中。

返回值

函数memmove返回s1的值

函数实现:

#include <string.h>

void *memmove(void *s1,const void *s2,size_t n)
{
char *sc1;
const char *sc2;
sc1=s1;
sc2=s2;

if(sc2<sc1 && sc1<sc2+n)
{
for(sc1+=n,sc2+=n;0<n;--n)
{
*--sc1=*--sc2;
}
}
else
for(;0<n;--n)
{
*sc1++=*sc2++;
}
return s1;
}


4)strcpy

概述

#include <string.h>

char *strcpy(char *s1,const char *s2);

说明

函数strcpy把s2指向的串(包括终止的空字符)复制到s1指向的数组中。如果复制发生在两个重叠的对象中,则行为未定义。

返回值

函数strcpy返回s1的值。

函数实现

#include <string.h>

char *strcpy(char *s1,const char *s2)
{
char *s=s1;
for(s=s1;(*s++=*s2++)!='\0';)
;
return s1;
}


5)strlen

概述

#include <string.h>

size_t strlen(const char *s);

说明

函数strlen计算s指向的串的长度

返回值

函数strlen返回终止的空字符前面的字符的数目

函数实现

#include <string.h>

size_t strlen(const char *s)
{
const char *sc;
for(sc=s;*sc!='\0';++sc)
;
return sc-s;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: