c语言中字符串函数strlen()、strcat()、strcpy()、strcmp()及内存操作函数memset()、memcpy()、memcmp()、memmove()的使用及编码实现
str打头的函数,其操作对象时字符串,mem打头的函数操作对象时内存
1、 strlen()函数
求字符串的有效长度,不包括'\0'
strlen()函数的实现:
#include
#include
#include
size_t mystrlen(char *str)
{
assert(ste != NULL);
const char*p = str;
size_t count = 0;
while(*p++ != '\0')
{
count++;
}
return count;
}
不借助任何辅助变量来计算字符个数
size_t mystrlen(char *str)
{
assert(str != NULL);
if(*str == '\0')
return 0;
else
return mystrlen(str+1)+1;
}
2、strcat()字符串连接函数
strcat(s1,s2)把字符串s2连接到s1后面,注意要保证s1有足够的空间
实现函数:
char *mystrcat(char *strD,const char *strS)
{
assert(strD!=NULL&&strS!=NULL);
char *pD = strD;
const char *pS = strS;
while(*pD != '\0')
{
pD++;
}
while(*pS != '\0')
{*pD++ = *pS++;}
*pD = '\0';
return strD;
}
3、strcpy()字符串拷贝函数
strcpy(s1,s2)字符串s2拷贝到s1中
char *mystrcpy(char *strD,const char *strS)
{
assert(strD != NULL&&strS!=NULL);
char *pD = strD;
const char *pS = strS;
while(*pS !='\0')
{*pD++ = *pS++;}
*pD = '\0';
return strD;
}
4、strcmp()字符串比较函数
int mystrcmp(const char *str1,const char *str2)
{
assert(str1 != NULL&& str2 != NULL);
const char *pstr1 = str1;
const char *pstr2 = str2;
int result = 0;
while(*pstr != '\0'||*pstr2 != '\0')
{
result = *pstr1 - *pstr2;
if(result != 0)
{break;}
pstr1++;
pstr2++;
}
if(result > 0)
result = 1;
else if(result < 0)
result = -1;
return result;
}
5、memset()内存设置或初始化函数
int array[10];
memset(array,0,sizeof(int)*10);
数组array用0初始化
void *mymemset(void *dest,int c,size_t count)
{
assert(dest != NULL);
char *p = (char *)dest;
while(count-- >0)
{*p++ = c;}
return dest;
}
6 、memcpy()内存拷贝函数
内存拷贝函数不仅能拷贝字符串,像strcpy()函数一样,它可以拷贝任意类型的的对象
函数实现:避免覆盖
void *mymemcpy(void *dest,const void *src,size_t count)
{
assert(dest != NULL||src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pD>=pD||pD>=pS+counst)
{
while(count--)
{*pD++ = *pS++;}
}
else
{
while(count-- > 0)
{*(pD+count)=*(pS+count)}
}
return dest;
}
7、memcmp()内存比较函数
int mymemcmp(const void*buf1,const void *buf2,size_t count)
{
assert(buf1 != NULL || buf2 != NULL)
const char *pbuf1 = (const char *)buf1;
const char *pbuf2 = (const char *)buf2;
str打头的函数,其操作对象时字符串,mem打头的函数操作对象时内存
1、 strlen()函数
求字符串的有效长度,不包括'\0'
strlen()函数的实现:
#include
#include
#include
size_t mystrlen(char *str)
{
assert(ste != NULL);
const char*p = str;
size_t count = 0;
while(*p++ != '\0')
{
count++;
}
return count;
}
不借助任何辅助变量来计算字符个数
size_t mystrlen(char *str)
{
assert(str != NULL);
if(*str == '\0')
return 0;
else
return mystrlen(str+1)+1;
}
2、strcat()字符串连接函数
strcat(s1,s2)把字符串s2连接到s1后面,注意要保证s1有足够的空间
实现函数:
char *mystrcat(char *strD,const char *strS)
{
assert(strD!=NULL&&strS!=NULL);
char *pD = strD;
const char *pS = strS;
while(*pD != '\0')
{
pD++;
}
while(*pS != '\0')
{*pD++ = *pS++;}
*pD = '\0';
return strD;
}
3、strcpy()字符串拷贝函数
strcpy(s1,s2)字符串s2拷贝到s1中
char *mystrcpy(char *strD,const char *strS)
{
assert(strD != NULL&&strS!=NULL);
char *pD = strD;
const char *pS = strS;
while(*pS !='\0')
{*pD++ = *pS++;}
*pD = '\0';
return strD;
}
4、strcmp()字符串比较函数
int mystrcmp(const char *str1,const char *str2)
{
assert(str1 != NULL&& str2 != NULL);
const char *pstr1 = str1;
const char *pstr2 = str2;
int result = 0;
while(*pstr != '\0'||*pstr2 != '\0')
{
result = *pstr1 - *pstr2;
if(result != 0)
{break;}
pstr1++;
pstr2++;
}
if(result > 0)
result = 1;
else if(result < 0)
result = -1;
return result;
}
5、memset()内存设置或初始化函数
int array[10];
memset(array,0,sizeof(int)*10);
数组array用0初始化
void *mymemset(void *dest,int c,size_t count)
{
assert(dest != NULL);
char *p = (char *)dest;
while(count-- >0)
{*p++ = c;}
return dest;
}
6 、memcpy()内存拷贝函数
内存拷贝函数不仅能拷贝字符串,像strcpy()函数一样,它可以拷贝任意类型的的对象
函数实现:避免覆盖
void *mymemcpy(void *dest,const void *src,size_t count)
{
assert(dest != NULL||src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pD>=pD||pD>=pS+counst)
{
while(count--)
{*pD++ = *pS++;}
}
else
{
while(count-- > 0)
{*(pD+count)=*(pS+count)}
}
return dest;
}
7、memcmp()内存比较函数
int mymemcmp(const void*buf1,const void *buf2,size_t count)
{
assert(buf1 != NULL || buf2 != NULL)
const char *pbuf1 = (const char *)buf1;
const char *pbuf2 = (const char *)buf2;
int res = 0;
while(count-- > 0)
{
if((res = *pbuf++ - *pbuf2++)!=0)
{break;}
if(res> 0)
{res = 1;}
if(res < 0)
{res = -1;}
reurn res;
}
}
8、memmove()内存移动函数
函数实现
void *mymemmove(void *dest,const void *src,size_t count)
{
assert(dest != NULL || src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pS >= pD||pD>=pS+count)
{
while(count-- >0)
{*pD++ = *pS++;}
}
else
{
while(count-- >0)
{*(pD+count)=*(pS+count);}
}
return dest;
}
while(count-- > 0)
{
if((res = *pbuf++ - *pbuf2++)!=0)
{break;}
if(res> 0)
{res = 1;}
if(res < 0)
{res = -1;}
reurn res;
}
}
8、memmove()内存移动函数
函数实现
void *mymemmove(void *dest,const void *src,size_t count)
{
assert(dest != NULL || src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pS >= pD||pD>=pS+count)
{
while(count-- >0)
{*pD++ = *pS++;}
}
else
{
while(count-- >0)
{*(pD+count)=*(pS+count);}
}
return dest;
}