您的位置:首页 > 其它

部分字符串库函数的重写(源码) toupper,memcpy,memmove,memset,memchr,strlen,strcpy,strcat,strcmp,strchr

2012-09-09 20:06 676 查看
#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

////////////////////////////////////////////////////

//Convert character to uppercase.

const char *toupper(char *s)

{

for(char *t=s;*t!='/0';t++)

{

if(*t>='a'&&*t<='z')

*t-='a'-'A';

}

return s;

}

////////////////////////////////////////////////////

//Copies characters between buffers.

//

// 函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。

// 与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'/0'而结束

// memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

//

// 返回值说明:返回指向dest的void *指针

// 附加说明: 指针src和dest所指的内存区域不可重叠

//

void *memcpy(void *dest, const void *src, size_t count)

{

assert( (dest!=NULL)&&(src!=NULL) );

char *tmp_dest = (char*)dest;

char *tmp_src = (char*)src;

while( count--)//不对是否存在重叠区域进行判断

*tmp_dest++ = *tmp_src++;

return dest;

}

////////////////////////////////////////////////////

//Moves one buffer to another.

//

// 函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,

// memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

// 返回值说明:返回指向dest的void *指针

void *memmove(void *dest, const void *src, size_t count)

{

assert( (dest!=NULL)&&(src!=NULL) );

char *tmp_dest=(char*)dest;

char *tmp_src=(char*)src;

if( tmp_dest+count<tmp_src||tmp_src+count<tmp_dest )

{// 如果没有重叠区域

while(count--)

*tmp_dest++=*tmp_src;

}

else

{// 如果有重叠区域

tmp_dest+=count-1;

tmp_src+=count-1;

while(count--)

*--tmp_dest=*--tmp_src;

}

return dest;

}

////////////////////////////////////////////////////

//Sets buffers to a specified character.

void *memset(void *src, int c, size_t count)

{

assert(src!=NULL);

char *tmpsrc=(char*)src;

while(count--)

*tmpsrc++ =(char)c;

return src;

}

////////////////////////////////////////////////////

//Finds characters in a buffer.

void* memchr(const void* src, int c, size_t count)

{

assert(src!=NULL);

char *tempsrc=(char*)src;

while(count&&*tempsrc!=(char)c)

{

count--;

tempsrc++;

}

if(count!=0)

return tempsrc;

else

return NULL;

}

////////////////////////////////////////////////////

//Get the length of a string

int strlen(const char *str)

{

assert( str!=NULL );

int length = 0;

while( *str++!='/0' )

length++;

return length;

}

////////////////////////////////////////////////////

// Copy a string

/*void strcpy(char *strDest, const char *strSrc)

{

assert( (strSrc!=NULL)&&(strDest!=NULL) );

while( *strSrc!='/0' )

*strDest++ = *strSrc++;

*strDest = '/0';

}*/

// 标准库函数

char *strcpy(char *strDest, const char *strSrc)

{

assert( (strSrc!=NULL)&&(strDest!=NULL) );

char *address = strDest;

while( (*address++ = *strSrc++)!='/0' );

return address;

}

////////////////////////////////////////////////////

//Append a string

char *strcat(char *str1, const char *str2)

{

assert( (str1!=NULL)&&(str2!=NULL) );

while( *str1!='/0' )

str1++;

while( (*str1++ = *str2++)!='/0' );

return str1;

}

////////////////////////////////////////////////////

//Compare strings

int strcmp(const char *str1, const char *str2)

{

while( *str1!='/0' && *str2!='/0' && *str1==*str2 )

{

str1++;

str2++;

}

if( *str1 =='/0' )

{

if( *str2 =='/0' )

return 0;

else

return -1;

}

else if( *str2 =='/0' )

{

if( *str1 =='/0' )

return 0;

else

return 1;

}

else

{

if( *str1<*str2 )

return -1;

else

return 1;

}

}

////////////////////////////////////////////////////

//Find a character in a string.

char *strchr(const char *str, int ch)

{

while( *str!='/0' && *str!=(char)ch )

str++;

if( *str==(char)ch )

return (char*)str;

else

return NULL;

}

////////////////////////////////////////////////////

//Find a substring.

char *strstr(const char *src, const char *strCharSet)

{

char *tempStr=(char*)src;

while( (*tempStr++!=*strCharSet)!='/0' );

char *temp=--tempStr;

if( *tempStr=='/0' )

return NULL;

else

{

while(*tempStr==*strCharSet&&*tempStr!='/0'&&*strCharSet!='/0')

{

tempStr++;

strCharSet++;

}

if(*strCharSet=='/0')

return temp;

else

return NULL;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐