1.实现strcpy 2.实现strcat 3.实现strstr 4.实现strchr 5.实现strcmp 6.实现memcpy 7.实现memmove
为了更好的去理解这几个函数的用法,自己去实现一下功能,才能更好的学习
#include<assert.h>
size_t Strlen(const char* str){ //无符号整型
assert(str != NULL);//首先要进行合法性判断,如果字符串本身都有问题,那么就没必要检验了
size_t count = 0;
while(str[count] != '\0'){
++count;
}
return conunt;
}
#include<assert.h>
char* Strcpy(char* dest,const char* src){
assert(dest != NULL);
assert(src != NULL);
int64_t i = 0;
for(i = 0;src[i] != '\0';i++){
dest[i] = src[i];
}
dest[i] = '\0';
return dest;
}
#include<assert.h>
char* Strcat(char* dest,const char* src){
assert(dest != NULL);
assert(src != NULL);
int i = 0;
for(i = 0; dest[i] != '\0';i++);
Strcpy(&dest[i],src);
return dest;
}
#include<assert.h>
const char* Strstr(const char* str1,const char* str2){
assert(str1 != NULL);
assert(str2 != NULL);
if(*str1 == '\0' || *str2 == '\0'){
return NULL;
}
const char* black_ptr = str1;
while(*black_ptr != '\0'){
const char* sub_ptr = str2;
const char* red_ptr = black_ptr;
while(*red_ptr != '\0' && *sub_ptr != '\0' &&(*red_ptr == *sub_ptr)){
++red_ptr;
++sub_ptr;
}
if(*sub_ptr == '\0'){
return black_ptr;
}
++black_ptr;
}
return NULL;
}
#include<assert.h>
const char* Strchr(const char* str,int chr){
assert(str != NULL);
while(*str){//*str表示字符数组中第一个字符
if(*str == (char)chr){
return (char*)str;//此时返回的是第一个找到所需字符的地址
}
++str;
}
return NULL;
}
#include<assert.h>
int Strcmp(const char* str1, const char* str2){
assert(str1 != NULL);
assert(str2 != NULL);
while(*str1 != '\0' && *str2 != '\0'){
if(*str1 > *str2){
return 1;
}else if(*str1 < *str2){
return -1;
}else{
++str1;
++str2;
}
}
//此时如果str1或者str2有一个提前遇到了'\0',那么跳出了while循环,接着判断
if(*str1 > *str2){
return 1;
}else if(*str1 < *str2){
return -1;
}else{
return 0;
}
}
#include<assert.h>
void* Memcpy(void* dest,void* src,size_t num){
assert(dest != NULL);
assert(src != NULL);
char* pdest = (char*)dest;//void*不能解引用,类型改变,只在运算中起作用,是临时的,本身的类型不改变,所以最后还是返回dest
char* psrc = (char*)src;
size_t i = 0;
for(i = 0;i < num;++i){
pdest[i] = psrc[i];
}
return dest;
}
#include<assert.h>
void* Memmove(void* dest,const void* src,size_t num){
assert(dest != NULL);
assert(src != NULL);
char* pdest = (char*)dest;
char* psrc = (char*)src;
if(pdest >= psrc && pdest < psrc + num){//这是标准库认为的缓冲区重合
//起始dest指针如果在src缓冲区范围以内,拷贝为缓冲区重合
//以外则不为缓冲区拷贝
int64_t i = 0;//从最后一个元素的下标开始,倒着拷贝
for(i = num - i;i >= 0;i++){
pdest[i] = psrc[i];
}
}else{
//完全按照原来方法拷贝
Memcpy(dest,src,num);
}
return dest;
}