您的位置:首页 > 其它

自己编写的string库函数

2009-06-24 09:23 225 查看
//都是自己编写的,仅供学习参考。

/*

date: 2009.6.24

author: Summon

function: functions for string.h

version: v1.0

right: all right opened

*/

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

char *MyStrcpy(char *pchDest, const char *pchSour)
{
if ((pchDest == NULL) || (pchSour == NULL))
{
return NULL;
}

char *ret = pchDest;

do
{
*pchDest = *pchSour;
pchDest++;
pchSour++;
}while (*pchSour != '/0');
*pchDest = '/0';
return ret;
}

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

char *MyStrncpy(char *pchDest, const char *pchSour, size_t count)
{
if ((pchDest == NULL) || (pchSour == NULL))
{
return NULL;
}
if (count == 0)
{
return pchDest;
}
char *ret = pchDest;

while (count--)
{
*pchDest = *pchSour;
pchDest++;
pchSour++;
if (*pchSour == '/0')
{
break;
}
}
*pchDest = '/0';
return ret;
}

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

int MyStrcmp(const char *pchStr1, const char *pchStr2)
{
if ((pchStr1 == NULL) || (pchStr2 == NULL))
{
printf("StrCompare input error!/n");
exit(-1);
}

int ret = 0;

while (*pchStr1 == *pchStr2)
{
pchStr1++;
pchStr2++;
if (*pchStr1 == 0)
{
return ret;
}
}
ret = *(unsigned char *)pchStr1 - *(unsigned char *)pchStr2;
return ret;
}
//////////////////////////////////////////////////////

int MyStrlen(const char *pchDest

{
if (pchDest == NULL)
{
return -1;
}

int ret = 0;
while(*pchDest != 0)
{
ret++;
pchDest++;
}

return ret;
}

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

int MyStrncmp(const char *pchStr1, const char *pchStr2, size_t count)
{
if ((pchStr1 == NULL) || (pchStr2 == NULL))
{
printf("StrCompare input error!/n");
exit(-1);
}
if (count == 0)
{
return 0;
}

int ret = 0;

while (count--)
{
if (*pchStr1 == *pchStr2)
{
if (*pchStr1 == 0)
{
return ret;
}
pchStr1++;
pchStr2++;//必须放到上个if后面再++
continue;
}else
{
pchStr1++;//虽然if和else里都有++,但是不能放到外面用共同的代码
pchStr2++;
break;
}
}

ret = *(unsigned char *)--pchStr1 - *(unsigned char *)--pchStr2;
return ret;//必须--才能返回正确的值,否则会向后移一个字符才比较
}
/////////////////////////////////////////////////////

void *MyMoveMemery(void *pDest, const void *pSrc, size_t nSize)
{
if ((pSrc != NULL) && (pDest != NULL))
{
return NULL;
}
if (nSize == 0)
{
return NULL;
}//input detected

void *ret = pDest;//remain the old pointer
unsigned char *d = (unsigned char *)pDest;//change to the most small memory unit
unsigned char *s = (unsigned char *)pSrc;

if (d < s + nSize)//special memory overlap
{
s += nSize - sizeof(pDest);
d += nSize - sizeof(pDest);

while (s != ((unsigned char *)pSrc - 1))//不能写!=pSrc,否则最后一个赋值语句不能执行。
{
*d = *s;
d--;
s--;
}
}else
{
while (nSize--)
{
*d = *s;
d++;
s++;
}
}
return ret;
//return the old pointer
}

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

char *MyStrcat(char *pchDestination, const char *pchSource)
{
if ((pchDestination == NULL) || (pchSource == NULL))
{
return NULL;
exit(-1);
}

char *ret = pchDestination;

while (*pchDestination != '/0')
{
pchDestination++;
}
while (*pchSource != '/0')
{
*pchDestination = *pchSource;
pchSource++;
pchDestination++;
}
*pchDestination = '/0';

return ret;
}

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

char *MyStrncat(char *pchDestination, const char *pchSource, size_t count)
{
if ((pchDestination == NULL) || (pchSource == NULL))
{
return NULL;
exit(-1);
}
if (count == 0)
{
return pchDestination;
}

char *ret = pchDestination;

while (*pchDestination != '/0')
{
pchDestination++;
}
while (count--)
{
if (*pchSource != '/0')
{
*pchDestination = *pchSource;
pchSource++;
pchDestination++;
}else
{
break;
}
}
*pchDestination = '/0';

return ret;
}

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

char *MyStrchr(const char *pStr, int find)
{
if (pStr == NULL)
{
return NULL;
}
if (find == 0)
{
return NULL;
}

char *ret = (char *)pStr;

while (*ret != '/0')
{
if (*ret == find)
{
return ret;
}
ret++;
}
return NULL;
}

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

void *MyMemchr(const void *pStr, int find, size_t count)
{
if ((count == 0) || (pStr == NULL))
{
return NULL;
}

const unsigned char *p = (const unsigned char *)pStr;//为什么要转换成这种类型呢?

while (count--)
{
if (*p != find)
{
p++;
}else
{
return (void *)p;
}
}

return NULL;
}

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

int MyMemcmp(const void *pchStr1, const void *pchStr2, size_t count)
{
if ((pchStr1 == NULL) || (pchStr2 == NULL))
{
printf("StrCompare input error!/n");
exit(-1);
}
if (count == 0)
{
return 0;
}

int ret = 0;
const unsigned char *p1 = (const unsigned char *)pchStr1;//比较内存都要转换为最小存储单位
const unsigned char *p2 = (const unsigned char *)pchStr2;

while (count--)
{
if (*p1 == *p2)
{
p1++;
p2++;
}else
{
ret = (*p1 - *p2);
}
}

return ret;
}
/////////////////////////////////////////////////

void *MyMemset(void *pchDest, int set, size_t count)
{
if (pchDest == NULL)
{
return NULL;
}
if (count == 0)
{
return pchDest;
}

unsigned char *p = (unsigned char *)pchDest;
unsigned char s = (unsigned char)set;

while (count--)
{
*p = s;
p++;
}

return pchDest;
}

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