栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言库函数的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言库函数的实现

C语言中有很多库函数,本篇博客来实现一些简单的库函数。

1.strlen函数的实现

strlen函数的主要功能是计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

int mystrlen(const char* str){
//count为字符串长度
	int count = 0;
//利用while循环来实现字符串长度的实现
	while (*str){
		count++;
		str++;
	}
	return count;
}

int main() {
	char str[] = "abcdef";
	int i = mystrlen(str);
	printf("%d",i);
}

2.strcpy函数的实现

strcpy函数会把 src 所指向的字符串复制到 dest。

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

#include 
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
//assert来判定main函数传参是否正确
	assert(dest != NULL);
	assert(src != NULL);

	while (*src){
		*dest = *src;
		dest++;
		src++;
	}
	return ret;
}
int main() {
	char arr[1024] = { 0 };
	char brr[] = "abc";
	printf("%s",my_strcpy(arr, brr));
}

3.memcpy函数的实现

memcpy函数会从存储区 str2 复制 n 个字节到存储区 str1。

void* my_memcpy(char* arr, char* brr, size_t num) {
	assert(arr != '');
	assert(brr != '');
	assert(num != 0);
	char* p1 = (char*)arr;
	char* p2 = (char*)brr;
	for (size_t i = 0; i < num; i++) {
		p1[i] = p2[i];
	}
	return arr;
}

4.memmove函数的实现

memmove函数会从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

void* my_memmove(char* arr, char* brr, size_t num) {
	assert(arr != '');
	assert(brr != '');
	assert(num != 0);
	char* p1 = (char*)arr;
	char* p2 = (char*)brr;
//判断一下数组是否重叠,如果重叠,则需要逆序赋值
	if (*arr >= *brr && *brr <= *arr) {
		for (long i = (long)(num - 1); i >= 0; i--) {
			p1[i] = p2[i];
		}
	}
	else {
		for (size_t i = 0; i < num; i++) {
			p1[i] = p2[i];
		}
	}
	return arr;
}

 5.strstr函数的实现

strstr函数会在字符串 str1 中查找第一次出现字符串 str2的位置,不包含终止符 ''。

//本函数使用了三个指针
//black指针会指向str1也就是本函数的arr
//red函数也会指向arr
//sub函数会指向brr
char* mystrstr(char* arr,char* brr) {
	char* black = arr;
	while (*black != '') {
		char* red = black;
        char* sub = brr;
		while (*sub != '' && *red != '' && *sub == *red) {
			red++;
			sub++;
		}
		if (*sub == '') {
			return black;
		}
		else if (*red == '') {
			black++;
		}
		else if (*red != *sub) {
			black++;
		}
	}
	return NULL;
}

6.strcat函数的实现

strcat函数会把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

char* my_strcat(char* arr, char* brr) {
	assert(arr != '');
	assert(brr != '');
	int i = 0;
	while (arr[i] != '') {
		i++;
	}
	int j = 0;
	while (brr[j] != '') {
		arr[i + j] = brr[j];
		j++;
	}
	arr[i + j] == '';
	return arr;
}

7.strcmp函数的实现

strcmp库函数会把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

#include 
#include 
int my_strcmp(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (str1 != '' && str2 != '') {
		if (*str1 > *str2) {
			return 1;
		}
		else if (*str1 < *str2) {
			return -1;
		}
		else {
			str1++;
			str2++;
		}
	}
	return 0;
}
int main() {
	char str1[1024] = "hello";
	char str2[1024] = "hell";
	printf("%d", my_strcmp(str1, str2));
}

以上就是一些简单的库函数的实现,总体不太难理解,需要明白原来的库函数的功能即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384477.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号