天天看點

C++ memcpy, strcpy, strcat, strcmp, strlen函數原型

#include<iostream>
#include<assert.h>
using namespace std;

void my_memcpy(char *dst, const char *src, int len){
	assert(dst != NULL && src != NULL && len>=0);
	if(dst<=src || dst>=src+len){ //判斷記憶體重疊 
		while(len--){
			*dst++ = *src++;
		}
	}
	else{
		src = src+len-1;
		dst = dst+len-1;
		while(len--){
			*dst-- = *src--;
		}
	}
}

char* my_strcpy(char *dst, const char *src){
	assert(dst != NULL && src != NULL);
	char *ret = dst;
	while((*ret++  = *src++) != '\0');
	return dst;
}

char *my_strcat(char *dst, const char *src){
	char *ret = dst; //後文return ret,故不能放在assert斷言之後聲明ret
	assert(dst != NULL && src != NULL);
	while(*dst) dst++;
	while(*src) *dst++ = *src++;
	*dst = '\0';
	return ret; 
}

int my_strcmp(const char *str1, const char *str2){
	assert(str1 != NULL && str2 != NULL);
	while(*str1 && *str2 && (*str1 == *str2)){
		str1++;
		str2++;
	}
	return *str1-*str2;
}

int my_strlen(const char *src){
	int len = 0;
	assert(src != NULL);
	while(*src++) len++;
	return len;
}

int main(){
	char src[10] = "fafafa";
	char *dst = new char[20];
	//my_memcpy(dst, src, 6);
	my_strcpy(dst, src);
	cout<<my_strcmp(dst, src)<<endl;
	cout<<my_strlen(src)<<endl;
	
my_strcat(dst, src);
cout<<dst<<endl;

}