C语言中常见的库函数实现

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<assert.h>


//设置
void * mymemset(void * src, char c, int n) {

	assert(src != NULL);
	char * p = (char*)src;
	while (n--) {
		*p = c;
		p++;
	}
	return src;
}

//memcopy
void * mymemcopy(void *dst, void *src, size_t n) {
	assert(dst != NULL && src != NULL);
	if (src<dst && (char*)src + n>dst) {
		char * s = (char*)src + n - 1;
		char * d = (char *)dst + n - 1;
		while (n--) {
			*d = *s;
			d--;
			s--;
		}
	}
	else {
		char * s = (char *)src;;
		char * d = (char *)dst;
		while (n--) {
			*d = *s;
			d++;
			s++;
		}
	}
	return dst;
}

//strcpy
char * mystrcpy(char * dst, char *src) {
	assert(dst != NULL && src != NULL);
	size_t n = strlen(src);
	if (src<dst && src + n>dst) {
		char * d = dst + n;
		*d-- = '\0';
		src = src + n - 1;
		while (n--) {
			*d = *src;
			d--;
			src--;
		}
	}
	else {
		char * d = dst;
		while ((*d++ = *src++) != 0);
	}
	return dst;
}

//strncpy
char * mystrncpy(char * dst, char *src, size_t n) {
	assert(dst != NULL && src != NULL);
	if (src<dst && src + n>dst) {
		int m = strlen(src) < n ? strlen(src) : n;
		char * d = dst + n;
		*d-- = '\0';
		src = src + m - 1;
		while (m--) {
			*d = *src;
			d--;
			src--;
		}
	}
	else {
		char * d = dst;
		size_t i = 0;
		while (i++ < n && (*d++ = *src++) != '\0');
		if (*(d - 1) != '\0') *d = '\0';
	}
	return dst;
}

//strlen
size_t mystrlen(const char *src) {
	assert(src != NULL);
	size_t ret = 0;
	while (*src++ != '\0') {
		ret++;
	}
	return ret;
}
//stcmp
int mystrcmp(const char *s1, const char * s2) {
	assert(s1 != NULL && s2 != NULL);
	while (s1&& s2 && *s1 == *s2) {
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
//strcmp 追加
/*
strcpy(src,  "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
最终的目标字符串: |This is destinationThis is source|
*/
char* mystrcat(char *dst, const char * src) {
	//assert(dst != NULL && src != NULL);
	char * d = dst;
	while (*d != '\0') {
		d++;
	}
	while ((*d++ = *src++) != '\0');
	return dst;
}

猜你喜欢

转载自blog.csdn.net/Raven_csdn/article/details/88675901