下面的函数实现主要参照linux2.4.0以及linux2.6.37内核源代码,经过简单修改得到。
1、strcpy
char * strcpy(char * dest,const char *src)
{
assert(NULL != dest && NULL != src);/* 入参检查 */
char *tmp = dest;/* 暂存输出地址 */
while ((*dest++ = *src++) != '\0')
;/* do nothing */ /* 拷贝所有字符,包括'\0' */
return tmp;/* 输出目标字符串地址 */
}
2、strncpy
char * strncpy(char * dest,const char *src,size_t count)
{
assert(NULL != dest && NULL != src);
char *tmp = dest;
while (count-- && (*dest++ = *src++) != '\0')/* 与strcpy相比增加条件count-- */
;
return tmp;
}
3、strcat
char * strcat(char * dest, const char * src)
{
assert(NULL != dest && NULL != src);
char *tmp = dest;
while (*dest)
dest++;/* 与strcpy相比增加该语句,指向目标串尾部的空字符'\0',准备连接 */
while ((*dest++ = *src++) != '\0')/* ~strcpy */
;
return tmp;
}
4、strncat
char * strncat(char *dest, const char *src, size_t count)
{
assert(NULL != dest && NULL != src);
char *tmp = dest;
if (count)/* 避免count==0时,遍历dest。与strcat相比增加此条件 */
{
while (*dest)
dest++;
while (count-- && (*dest++ = *src++) != '\0')/* 与strcat相比增加条件(count--) */ /* ~strncpy */
;
}
return tmp;
}
5、strcmp
int strcmp(const char *cs, const char *ct)
{
int ret = 0;/* 默认相同 */
unsigned char c1, c2;
while (1)
{
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)/* 不相等,返回比较结果 */
{
ret = ((c1 < c2) ? -1 : 1);
break;
}
/*
* c1 == c2,又分为两种情况:
* 1, c1==c2 != '\0', 继续比较下一个字符;
* 2, c1==c2 == '\0', 比较完毕,说明两字符串完全相同,返回
*/
if (!c1)
break;
}
return ret;
}
6、strncmp
int strncmp(const char *cs, const char *ct, size_t count)
{
int ret = 0;
unsigned char c1, c2;
while (count--)/* 与strcmp相比,增加此条件 */
{
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
{
ret = ((c1 < c2) ? -1 : 1);
break;
}
if (!c1)
break;
}
return ret;
}