strcpy/strncpy/strcat/strcmp/strlen函数的c语言实现

时间:2022-09-05 22:51:58

1、strcpy

头文件:#include <string.h>

函数原型:char *strcpy(char *dest, const char *src)

功能:将字符串src拷贝到dest处

参数:src 为源字符串的起始地址,dest为目标串的起始地址

返回值:目标串dest的起始地址

注意:strcpy只用于字符串复制,不需要指定长度,遇到被复制字符的串结束符"\0"(包括结束符“\0”也会一起复制)才结束,所以容易溢出。

c代码:

char *strCpy(char *dest, const char *src)
{

if (NULL == dest || NULL == src)
return NULL;

char *tempDest = dest;
while ((*dest++ = *src++) != '\0');
return tempDest;
}

 
2、strncpy 

头文件:#include <string.h>

函数原型:char *strncpy(char *dest, const char *src, size_t n)

功能:将字符串src前n个字符拷贝到dest处

参数:src 为源字符串的起始地址,dest为目标串的起始地址

返回值:目标串dest的起始地址

注意:strncpy 只复制指定的src的前n位,所以dest串没有结束符‘\0’。

c代码:

char *strNcpy(char *dest, const char *src, size_t n)
{
if (NULL == dest || NULL == src || n < 0)
return NULL;

char *tempDest = dest;

while (n-- > 0)
*dest++ = *src++;

//*dest = '\0'; //此处不是函数的实现,为了测试而添加

return tempDest;
}

 

2015年07月03(修改)

今天去查strnpy函数的时候,上面有这样一句话,If the length of src is less than n, strncpy() pads  the  remainder  of dest with null bytes.大致意思是说如果src字符串的长度小于n,则dest中剩下的部分由‘\0’填充。

上方函数的实现没有体现这一功能,也没有对src字符串的长度作检查,故修改为如下:

改:

char *strNcpy(char *dest, const char *src, size_t n)
{
if (NULL == dest || NULL == src || n < 0)
return NULL;
size_t i;

for (i = 0; i < n && src[i] != '\0'; i++)
dest[i] = src[i];
for ( ; i < n; i++)
dest[i] = '\0';

return dest;
}

 

 
 
 

3、strcat

头文件:#include <string.h>

函数原型:char *strcat(char *dest, const char *src)

功能:将字符串src的字符链接在dest的字符串后面,并在dest串末尾添加‘\0’

参数:src 为源字符串的起始地址,dest为目标串的起始地址

返回值:目标串dest的起始地址

c代码:

har *strCat(char *catDest, const char *catSrc)
{
if (NULL == catDest || NULL == catSrc)
return NULL;
char *pDest = catDest;
while (*pDest != '\0')
pDest++;
while ((*pDest++ = *catSrc++) != '\0');

return catDest;
}

 
4、strcmp 

头文件:#include <string.h>

函数原型:int strcmp(const char *s1, const char *s2)

功能:按照ASCII码顺序比较字符串s1和字符串s2的大小

参数:s1、s2 分别为两字符串的起始地址

返回值:比较结果

s1 > s2, 返回值大于0 

s1 = s2, 返回值等于0

s1 < s2, 返回值小于0

c代码:

方法一:

int strCmp(const char *s1, const char *s2)
{
if (NULL == s1 || NULL == s2)
return ERROR; //ERROR定义的宏 ,为了返回错误

while (*s1 && *s2 && *s1 == *s2)
{
++s1;
++s2;
}

return (*s1 - *s2);
}

 
方法二: 

int strCmpOther(const char *s1, const char *s2)
{
if (NULL == s1 || NULL ==s2)
return ;
while (*s1 || *s2)
{
if (*s1 - *s2)
return (*s1 - *s2);
else
{
++s1;
++s2;
}
}
return 0;
}

 
5、strlen 

头文件:#include <string.h>

函数原型:size_t strlen(const char *s)

功能:求字符串的长度(不含字符串结束标志‘\0’)

参数:s为字符串

返回值:字符串的长度(不含字符串结束标志‘\0’)

c代码:

size_t strLen(const char *s)
{
if (NULL == s)
return -1;
size_t len = 0;

while ((*s++) != '\0')
{
++len;
}

return len;
}