C语言模拟实现库函数详解

 更新时间:2022年07月13日 10:51:53   作者:BaconZzz  
C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用,下面让我们一起来详细了解它

前言

库函数的模拟,看似多此一举,实则汲取精华。

1.字符串函数

1.1字符串控制函数

1.1.1 strlen的模拟

求字符串长度

//--------------------------------------
size_t strlen( const char *string );
//--------------------------------------
//返回值用 int / size_t 各有好处
int MyStrlen(const char* str)
{
	assert(str);
	int cnt = 0;
	while (*str != '\0')
	{
		str++;
		cnt++;
	}
	return cnt;
}
int main()
{
	char arr[] = "bacon";
	printf("%d\n", MyStrlen(arr));
	return 0;
}

1.1.2 str(n)cpy的模拟

拷贝字符串

//-------------------------------------
char* strcpy(char* dest, const char* src)
//-------------------------------------
char* MyStrcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char str1[30] = "Bacon";
	char str2[] = " is your friend.";
	MyStrcpy(str1 + 5, str2);
	printf("%s\n", str1);
	return 0;
}
//Bacon is your friend.
//------------------------------------------------------------
char* strcpy(char* dest, const char* src, size_t num)
//---------------------------------------------------------------
char* MyStrncpy(char* dest, const char* src, size_t num)
{
	assert(dest && src);
	char* ret = dest;
	while (num--)
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char str1[20] = { 0 };
	char str2[] = "bacon";
	printf("%s\n", MyStrncpy(str1, str2, 4));
	return 0;
}
//baco

Bacon is your friend.

baco

1.1.3 str(n)cmp的模拟

逐个比较字符串中的字符

//-----------------------------------------------
int strcmp(const char* str1, const char* str2)
//-----------------------------------------------
int MyStrcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2)
	{
		str1++;
		str2++;
	}
	if (*str1 == *str2)
		return 0;
	else if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdfe";
	printf("%d\n", MyStrcmp(str1, str2));
	return 0;
}
//-1
//-----------------------------------------------------
int strncmp(const char* str1, const char* str2, size_t num)
//---------------------------------------------------------
int MyStrncmp(const char* str1, const char* str1, size_t num)
{
	assert(dest && src);
	while (num--)
	{
		if (*str1!= *str2)
		{
			if (*str1> *str2)
				return 1;
			else
				return -1;
		}
		str1++;
		str2++;
	}
	return 0;
}
int main()
{
	char str1[] = "abcdef";
	char str2[] = "abcdfe";
	printf("%d\n", MyStrncmp(str1, str2, 5));
	return 0;
}

-1

1.1.4 str(n)cat的模拟

字符串追加

//----------------------------------------------
char* strcat(char* dest, const chat* src)
//----------------------------------------------
char* MyStrcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	//找到字符串结尾
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++);
	return ret;
}
int main()
{
	char str1[20] = "bacon";
	char str2[] = " king";
	printf("%s\n", MyStrcat(str1 , str2));
	return 0;
}
//bacon king
//----------------------------------------------------------
char* strncat(char* dest, const char* src, size_t num);
//----------------------------------------------------------
char* MyStrncat(char* dest, const char* src, size_t num)
{
	assert(dest && src);
	char* ret = dest;
	while(*dest != '\0')
	{
		dest++;
	}
	while (num--)
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char str1[30] = "Bacon";
	char str2[] = " is your friend";
	printf("%s\n", MyStrncat(str1, str2, 8));
	return 0;
}
//Bacon is your

bacon king

Bacon is your

1.1.5 strstr的模拟

查找子串

//------------------------------------------------
char* strstr(const char* str1, const char* str2)
//--------------------------------------------------
char* MyStrstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* p = str1;
	char* s1 = str1;
	char* s2 = str2;
	while (*p)//str1走完就可以跳出了
	{
		//找到可能匹配的位置
		while (*s1 != *s2)
		{
			s1++;
		}
		p = s1;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return p;
		}
		else
		{
			s1 = p + 1;
			s2 = str2;
			p = s1;
		}
	}
	return NULL;
}
int main()
{
	char str1[] = "abbbcdef";
	char str2[] = "bbc";
	printf("%s\n", MyStrstr(str1, str2));
	return 0;
}

1.1.6 strtok的使用

切分字符串:根据给定的分隔符,把分隔符置 ‘\0’ ,并保存当前位置(存在静态区)

传 非NULL : 从当前位置开始strtok传 NULL : 从上次保存的位置开始strtok

比较奇怪的函数,此处仅示范使用方法

//---------------------------------------------
char* strtok(char* str , const char* sep)
//---------------------------------------------
//由函数定义:我们需要多次切分的时候——第一次传字符串地址,之后传NULL
int main()
{
	char* p = "SiDiuPiDe233@icloud.com";
	char sep[] = "@.";
	char arr[30];
	strcpy(arr, p);
	char* i = NULL;
	for (i = strtok(arr, sep); i != NULL; i = strtok(NULL, sep))
	{
		printf("%s\n", i);
	}
	return 0;
}

SiDiuPiDe
icloud
com

1.1.7 strerror的使用

打印错误码对应的信息

在C语言中设置了一个 名为 “errno” 的全局变量,来保存错误码(不同运行错误的编号)

//---------------------------------
char* strerror(int errnum);
//-----------------------------------
int main()
{
	FILE* p = fopen("test.txt", "r");
	if (NULL == p)
		printf("%s\n", strerror(errno));
	return 0;
}

No such file or directory

1.2 字符串分类函数和字符串转换函数

函数说明
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,az,AZ,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

如果他的参数符合下列条件就返回真

汲取:

指针使用前 assert

用const保护不需要修改的数据

对于while中的指针的加减需要留心 while(*dest1++)while(*dest2) { dest2++; }

  • dest1跳出循环后是野指针
  • dest2跳出循环后指向’\0’

到此这篇关于C语言模拟实现库函数详解的文章就介绍到这了,更多相关C语言库函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单谈谈C++中指针与引用的区别

    简单谈谈C++中指针与引用的区别

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法
    2017-04-04
  • Qt Creator使用教程的简单说明

    Qt Creator使用教程的简单说明

    如今 Qt Creator 功能十分强大了,包含项目模板生成、代码编辑、UI 设计、QML 界面编辑、调试程序、上下文帮助等丰富功能,本文就详细的介绍一下如何使用
    2021-08-08
  • C语言实现SM4加解密方式

    C语言实现SM4加解密方式

    这篇文章主要介绍了C语言实现SM4加解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 在std::thread中创建并管理QEventLoop的全面解析

    在std::thread中创建并管理QEventLoop的全面解析

    QEventLoop的工作原理可以简单地理解为一个无限循环,它会不断地检查是否有新的事件需要处理,如果有,就将事件从事件队列中取出,然后找到相应的事件处理器进行处理,这篇文章主要介绍了在std::thread中创建并管理QEventLoop的全面指南,需要的朋友可以参考下
    2023-06-06
  • C++模拟实现stack和Queue的操作示例

    C++模拟实现stack和Queue的操作示例

    这篇文章主要介绍了C++模拟实现stack和Queue的操作示例,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • C语言实例上手深入理解操作符的使用

    C语言实例上手深入理解操作符的使用

    C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们在实例中练一下
    2022-05-05
  • C 语言编写一个计算器界面(可视化界面和多功能)

    C 语言编写一个计算器界面(可视化界面和多功能)

    今天给大家分享一个计算器功能,主要功能有加法减法乘除法求余功能,用户可以在主菜单选择需要计算的功能,接下来根据用户输入的数字进行计算输出结果,喜欢的朋友拿去用吧
    2021-06-06
  • C语言中如何在结构体内定义函数

    C语言中如何在结构体内定义函数

    这篇文章主要介绍了C语言中如何在结构体内定义函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解计数排序算法及C语言程序中的实现

    详解计数排序算法及C语言程序中的实现

    技术排序算法与我们普通接触的冒泡排序和快速排序等基于元素比较的算法不同,在编程中通过C语言的数组能够清除地表达出来,这里我们就来详解计数排序算法及C语言程序中的实现
    2016-07-07
  • C++实现将一个字符串中的字符替换成另一个字符串的方法

    C++实现将一个字符串中的字符替换成另一个字符串的方法

    这篇文章主要介绍了C++实现将一个字符串中的字符替换成另一个字符串的方法,需要考虑的情况比较全面,有不错的借鉴价值,需要的朋友可以参考下
    2014-09-09

最新评论