欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言内置函数自主实现

程序员文章站 2022-03-08 15:04:33
...

1.实现strcpy

char *Strcpy(char *dest, const char *src) {
	if (dest == NULL || src == NULL) {
		return dest;
	}
	int i = 0;
	for (; src != '\0'; ++i) {
		dest[i] = src[i];
	}
	dest[i] = '\0';
	return dest;
}

2.实现strcat

char *Strcat(char *dest, const char *src) {
	if (dest == NULL || src == NULL) {
		return dest;
	}
	char *p = dest;
	while (*p != '\0')
		++p;
	Strcpy(p, src);
	return dest;
}

3.实现strstr
strstr是字符串查找函数,寻找dest中是否存在子字符串src,如果存在则返回子串的首元素在dest中的地址。这里感觉使用kmp算法好像更复杂,就直接一个一个比较吧。

const char *Strstr(const char *dest, const char *src) {
	if (dest == NULL || src == NULL) {
		return NULL;
	}
	const char *cmp = dest;
	const char *str1 = cmp;
	const char *str2 = src;
	while (*str1 != '\0' && *str2 != '\0') {
		if (*str1 == *str2) {
			++str1;
			++str2;
		}
		else {
			++cmp;
			str1 = cmp;
			str2 = src;
		}
	}
	if (cmp == '\0') {
		return NULL;
	}
	return cmp;
}

4.实现strchr
字符查找函数,和strstr类似但是要更简单

const char *Strchr(const char *str, int character) {
	if (str == NULL) {
		return NULL;
	}
	while (*str != '\0') {
		if (*str == character) {
			return str;
		}
		++str;
	}
	return NULL;
}

5.实现strcmp
字符串比较函数,返回不相等时的字符的差值或者相等时返回0。
由于函数返回值为int,参数非法值返回啥值纠结了好久······于是干脆就直接报错了。
函数体中就一个while循环就够了,循环结束条件为两字符串之一遍历完或者某一位置的对应字符不相等。然后直接返回该位置上的差值,由于字符类型转为int一般为正数,’\0’值为0,所以dest比src小返回负数,相等返回0,比src大返回正数。

int Strcmp(const char *dest, const char *src) {
	assert(dest != NULL && src != NULL);
	while (*dest != '\0' && *src != '\0') {
		if (*dest == *src) {
			++dest;
			++src;
		}
		else {
			break;
		}
	}
	return *dest - *src;
}

//6.实现memcpy
内存拷贝函数,只要定义两个char类型的指针就可以实现一个字节一个字节地拷贝了。

void *Memcpy(void *destination, void *source, size_t n) {
	if (destination == NULL || source == NULL) {
		return NULL;
	}
	char *str1 = destination;
	char *str2 = source;
	for (size_t i = 0; i < n; ++i) {
		str1[i] = str2[i];
	}
	return destination;
}

//7.实现memmove
这个函数功能和memcpy类似,区别在于使用它时不用考虑destination和source在内存上是否重叠,而memcpy若是传了两个在内存上重叠的字符串可能会得到一个错误的结果。
memmove会在执行时判断两个字符串是否重叠,并根据重叠位置决定拷贝方式——从前往后还是从后往前。

void * Memmove(void * destination, void * source, size_t num) {
	if (destination == NULL || source == NULL) {
		return NULL;
	}
	// 判断重叠位置
	char *p1 = destination;
	char *p2 = source;
	int jug = 1;
	if (destination == source) {
		return destination;
	}
	for (size_t i = 1; i < num; ++i) {
		if (p1 == p2 + i) {
			jug = 0;
		}
	}
	if (jug) {
		for (size_t i = 0; i < num; ++i) {
			p1[i] = p2[i];
		}
	}
	else {
		for (size_t i = num - 1; i > 0; --i) {
			p1[i] = p2[i];
		}
	}
	return destination;
}
相关标签: C语言学习