[C++] 自己编写strlen、strcpy、strcmp、strcat、memset、memcpy
来自:
C/C++面试常见的几个库函数详解(strcpy,memcpy,memset,atoi…)
以下均包含如下头文件
#include<assert.h>
1.求字符串长度(不包括’\0’在内)的函数my_strlen
//
int my_strlen(const char* pStr){
assert(pStr!=nullptr);
int length=0;
while(*pStr++!='\0'){
length++;
}
return length;
}
2.字符串拷贝函数my_strcpy
//
char* my_strcpy(char* strDest,const char* strSrc){
assert(strDest!=nullptr&&strSrc!=nullptr);
char* temp=strDest;//我们需要返回dest的头指针,所以dest保留
while(*strSrc!='\0'){
*temp++=*strSrc++;
}
//strSrc末尾的'\0'也需要复制过来
*temp='\0';
return strDest;//返回dest头指针,支持链式表达式
}
3.字符串比较函数my_strcmp
//
// 设这两个字符串为strDest,strSrc
// 若strDest==strSrc,则返回零;
// 若strDest>strSrc,则返回正数;
// 若strDest<strSrc,则返回负数;
int my_strcmp(const char* strDest,const char* strSrc){
assert(strDest!=nullptr&&strSrc!=nullptr);
while(*strDest&&*strSrc&&*strDest==*strSrc){
strDest++;
strSrc++;
}
//若相等,则*strDest - *strSrc = '\0' - '\0' = 0;
//若*strDest-*strSrc > 0,返回正数
//若*strDest-*strSrc < 0,返回负数
return *strDest-*strSrc;
}
4.字符串连接函数my_srccat
//
char* my_strcat(char* strDest,char* strSrc){
assert(strDest!=nullptr&&strSrc!=nullptr);
char* temp=strDest;
while('\0'!=*temp)
temp++;
//循环结束后temp指向strDest的结尾处'\0'
while('\0'!=strSrc)
*temp++=*strSrc++;
//strSrc末尾的'\0'也需要复制过来
*temp='\0';
return strDest;
}
5.内存初始化 my_memset
//
//将s中前n个字节用 ch 替换并返回 s
//注意:memset是以【字节】为单位进行赋值的
void* my_memset(void* s,int ch,size_t n){
assert(s!=nullptr);
void* temp=s;
while(n--){
*((char*)temp)=(char)ch;//转化为1字节
temp=(char*)temp+1;
}
return s;
}
6.内存拷贝函数my_memcpy
//
//memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
void* my_memcpy(void* strDest,const void* strSrc,size_t n){
assert(strDest!=nullptr&&strSrc!=nullptr);
int i=0;
void* temp=strDest;
while(i<n){
*((char*)temp+i)=*((char*)strSrc+i);
i++;
}
return strDest;
}