C语言常用库函数的使用及模拟实现详解例举

目录
  • 1.strlen
    • 1.计数法
    • 2.递归法
    • 3.指针减指针
  • 2.strcpy
  • 3.strcmp
  • 4.strcat
  • 5.strstr
  • 6.strtok
  • 7.字符分类函数
  • 8.memcpy&memmove
  • 9.memcmp

经历了C语言基础篇的学习,让我们来简单了解几个C语言的库函数!

1.strlen

字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。

函数的模拟实现

1.计数法

int my_strlen(dest)
{
int count=0;
    while(dest)//当dest等于'\0'时停止循环
{
    count++;
    dest++;
}
return count;
}

2.递归法

int my_strlen(char* dest)
{
    int count=0;
    if(*dest!='0')
    {
        dest++;
        count++;
        return my_strlen(dest,count)
    }
    else
    return count;
}

3.指针减指针

int my_strlen(char* dest)
{
    char* arr=dest;//定义一个新指针指向dest
    while(*arr)//直到arr指向'\0'
    {
    arr++;
    }
    return (arr)-(dest);//指针相减代表两个指针之间的元素个数
}

2.strcpy

char* strcpy ( char * destination , const char * source )

会将源字符串中的 '\0' 拷贝到目标空间。

目标空间必须足够大,并且可变以确保能存放源字符串。

函数的模拟实现

char* my_strcpy(char* dest, const char* str)
{
	char* arr1 = dest;
	while ((*dest++ = *str++)!='\0')
	{
		;
	}
	return arr1;
}
int main()
{
	char arr1[] = "***************";
	char arr2[] = "hello word";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

3.strcmp

int strcmp ( const char * str1, const char * str2 );

第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字

函数的模拟实现

int my_strcmp(char* arr1,char* arr2)
{
	while(*arr1 == *arr2)
	{
		if (*arr1 == '\0' && *arr2 == '\0')
		{
			return 0;
		}
		else
		{
			arr1++; arr2++;

		}
	}if (*arr1 > *arr2)
	{
		return 1;
	}
	else if (*arr1 < *arr2)
	{

		return -1;
	}
}

4.strcat

char * strcat ( char * destination, const char * source );

函数的模拟实现

char* my_strcat(char* dest, char* str)
{
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++=*str++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[50] = "hello";
	char arr2[] = "word";
	char* count=my_strcat(arr1, arr2);
	printf("%s", count);
	return 0;
}

5.strstr

char * strstr ( const char *str1, const char * str2);

函数的模拟实现

char* my_strstr(char* dest, char* str)
{
	char* arr1 = str;
	char* cur = dest;
	while (*cur)
	{
		str = arr1;
		dest = cur;
		if (*dest != *str)
		{
			dest++;
			str++;
		}
		else if (*dest == *str)
		{
			while (*dest == *str)
			{
				dest++; str++;

			}if (*str == '\0')
			{
				return cur;
			}
		}
		cur++;
	}return NULL;
}
int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret=my_strstr(arr1, arr2);
	if (NULL == ret)
	{
		printf("找不到子串\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

6.strtok

char * strtok ( char * str, const char * sep );

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记

int main()
{
	char buff[] = "www.aaabbbccc@qq.com";
	char buf[20] = { 0 };
	strcpy(buf, buff);
	char* sep=".@";
	char* str = NULL;
	for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep))
			{//NULL是从保存好的位置开始往后找
				printf("%s\n", str);
			}
	return 0;
}

7.字符分类函数

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 字母或者数字,a~z,A~Z,0~9
ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph
任何图形字符
isprint 任何可打印字符,包括图形字符和空白字符

8.memcpy&memmove

void * memcpy ( void * destination , const void * source , size_t num )

函数模拟实现

void* my_memmove(void* dest,void* str , size_t count)
{
	void* ch = dest;
	if (dest > str)
	{
		while (count--)
		{
			*((char*)dest + count) = *((char*)str + count);
		}
	}
	else
	{
		while (count--)
		{
			*(char*)dest = *(char*)str;
			dest=(char*)dest+1;
			str=(char*)str+1;
		}
	}
}
int main()
{
	int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
	my_memmove(arr1+2, arr1 , 20);
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d", arr1[i]);
	}
	return 0;
}

9.memcmp

int memcmp ( const void * ptr1 , const void * ptr2 , size_t num );

函数模拟实现

void* my_memcmp(char* arr, char* arr1, int count)
{
	while (count--)
	{
		if (*(char*)arr > *(char*)arr1)
		{
			return 1;
		}
		else if ((*(char*)arr < *(char*)arr1))
		{
			return -1;
		}
		arr++; arr1++;
	}	return 0;
}
int main()
{
	int arr[] = { 1,2,3,4,5 };
	int arr1[] = { 1,2,3,4,4 };
	int ret=my_memcmp(arr, arr1, 20);
	printf("%d", ret);
	return 0;
}

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

(0)

相关推荐

  • 一篇文章带你实现C语言中常用库函数的模拟

    目录 前言 函数介绍 strlen(求字符串长度) strcpy(字符串拷贝) strcat(字符串追加) strcmp(字符串比较) strstr(找子字符串) memcpy(内存拷贝) memmove(内存移动) 总结 前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中. 字符串常量适用于那些对它不做修改的字符串函数. 函数介绍 strlen(求字符串长度) size_t strlen ( const char * str

  • 一篇文章教你自己动手实现C语言库函数

    目录 memmove 函数声明 函数作用 实现memmove memcpy 函数声明 函数作用 实现memcpy strstr 函数声明 函数作用 实现strstr strcat 函数声明 函数作用 实现strcat strcmp 函数声明 函数作用 实现strcmp strcpy 函数声明 函数作用 实现strcpy strlen 函数声明 函数作用 实现strlen 总结 memmove 函数声明 void * memmove ( void * destination, const void

  • C语言strcpy库函数详解

    目录 C语言strcpy库函数的讲解 附1:MSDN关于strcpy库函数的简介 思路: 总结 C语言strcpy库函数的讲解 附1:MSDN关于strcpy库函数的简介 思路: 1.从上面的MSDN关于strcpy库函数的简介中,我们可以知道,传进函数的第一个参数是目标数组,也就是用来接收被拷贝的字符串,第二个参数是源头数组,也就是将这个参数的字符串拷贝到目标数组里面去.(一定要注意目标数组的空间大小一定要比源头数组的空间大小大,不然即使拷贝成功了也会报错!!!) 2.在我们自我实现strcp

  • C语言实现常用字符串库函数(推荐)

    目录 一.实现memcpy 二.memmove模拟实现 三.strlen的模拟实现 1.计数器方法: 2.递归方式: 3.利用指针实现: 四.strcpy的模拟实现 五.strcmp的模拟实现 六.strstr模拟实现 七.模拟实现strcat 一.实现memcpy 将src所指向的内容拷贝到dst所指向的位置,拷贝len个字节. memcpy是内存拷贝函数 memcpy在使用的时候不用考虑类型,以字节为单位进行拷贝 遇到"\0"的时候不会停下,所以拷贝字符串的时候最好还是用strcp

  • 实现C语言常用字符串库函数

    目录 strlen strcpy strcat strcmp 总结 strlen 数组长度的计算是通过strlen来的,它的作用就是判断给定的数组元素个数,直到碰到\0结束 函数原型 size_t strlen ( const char * str ); 废话少说,直接上代码 int my_strlen(char *str) { char* ch=str; int count=0; while(*ch!='\0') { count++; ch++; } return count; } 但考虑到安

  • C语言 超详细讲解库函数

    目录 1 返回整数的getchar函数 2 更新顺序文件 3 缓冲输出与内存分配 4 库函数 练习 1 返回整数的getchar函数 代码: #include<stdio.h> int main() { char c; while((c = getchar())!=EOF)//getchar函数的返回值为整型 putchar(c); return 0; } 上述代码有三种可能: 某些合法的输入字符在被"截断"后使得c的取值与EOF相同,程序将在复制的中途停止. c根本不可能

  • C语言库函数qsort及bsearch快速排序算法使用解析

    目录 qsort 含义 实现 格局打开 bsearch qsort qsrot 就是C语言库函数中的快速排序函数,对数组,结构体都可以实现快速排序, 他在头文件<stdlib.h>中使用,声明格式为: void qsort(void* base, size_t nums, size_t size, int (*compare)(const void *, const void*)) 这么烦人一长串的参数各是什么意思呢,base 是指向要排序的数组的第一个元素的指针.nums是由 base 指向

  • C语言库函数中qsort()的用法

    目录 (一)void*  的指针类型是什么? (二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数? (三)使用qsort()来排序不同类型的数据  总结: qsort是库函数提供的一种排序方法,我们就简单1了解一下怎么去用,而不去深究它的库函数是怎么写的 qsort是库函数中提供的一种能排序任何类型的数据的一种排序方法,思想是quick sort(快速排序),今天我听

  • C语言常用库函数的使用及模拟实现详解例举

    目录 1.strlen 1.计数法 2.递归法 3.指针减指针 2.strcpy 3.strcmp 4.strcat 5.strstr 6.strtok 7.字符分类函数 8.memcpy&memmove 9.memcmp 经历了C语言基础篇的学习,让我们来简单了解几个C语言的库函数! 1.strlen 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' ). 函数的模拟实现 1.计数法 int my_strlen(dest)

  • R语言常用两种并行方法之snowfall详解

    上一篇博客(R中两种常用并行方法之parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂到服务器上进行运行时,更看重的是其稳定性. 这时就要介绍R中的另一个并行利器--snowfall,这也是在平时做模拟时用的最多的一种方法. 针对上篇中的简单例子 首先是一个最简单的并行的例子,这个例子不需要载入任何依赖库.函数.对象等.相对也比较简单: library(snowfall) # 载入snowf

  • R语言常用两种并行方法之parallel详解

    目录 并行计算 在模拟时什么地方可以用到并行? 怎么在R中看我们可以使用并行? parallel(简单) 由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfall,这两种方法各有优缺,但还是推荐snowfall,整体较为稳定,不容易因为内存不足或者并行线程过多等原因而报错. 并行计算 并行计算: 简单来讲,就是同时使用多个计算资源来解决一个计算问题,是提高计算机系统计算速度和处理能力的一种有效手段.(参考:并行计算简介) 一个问题被分解成为一系列可以并发执行的离

  • C语言预处理预编译命令及宏定义详解

    目录 程序翻译环境和执行环境 翻译环境:详解编译+链接 1. 编译 - 预处理/预编译 test.c ---- test.i 2. 编译 - 编译 test.i ---- test.s 3. 编译 - 汇编 test.s ---- test.obj 4. 链接 test.obj ---- test.exe 运行环境 预处理/预编译详解 #define 定义标识符 #和## #的作用 ##的作用 命名约定 命令行定义 条件编译 常见的条件编译指令 文件包含 offsetof(宏类型,成员名字)偏移

  • C语言头文件<string.h>函数详解

    目录 1. strlen —— 求字符串长度 1.1 strlen 的声明与用处 1.2 strlen 的用法 1.3 strlen 的模拟实现 2. strcpy —— 字符串拷贝 2.1 strcpy 的声明与用处 2.2 strcpy 的用法 2.3 strcpy 的模拟实现 3. strcmp —— 字符串比较 3.1 strcmp 的声明与用处 3.2 strcmp 的用法 3.3 strcmp 的模拟实现 4. strcat —— 字符串追加 4.1 strcat 的声明与用处 4.

  • C语言中的指针以及二级指针代码详解

    很多初学者都对C中的指针很迷糊,希望这篇blog能帮助到大家: 1.什么是"指针": 在执行C程序的时候,由于我们的数据是存储在内存中的.所以对于C程序本身来说,如果想找到相应被调用的数据,就要知道存储该数据的内存地址是多少,换言之,C程序通过已知的内存地址到相应的内存位置存储数据. 这里简单说一下内存管理(对于初学者来说.为了避免专业术语引发的理解问题,下面的叙述尽量避免专业定义:),对于现代计算机系统来说,内存空间分为两个区域,一个是"数据区",一个是"

  • oracle sql语言模糊查询--通配符like的使用教程详解

    oracle在Where子句中,可以对datetime.char.varchar字段类型的列用Like子句配合通配符选取那些"很像..."的数据记录,以下是可使用的通配符: %   零或者多个字符 _    单一任何字符(下划线) \     特殊字符 oracle10g以上支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,RE

  • C语言编程C++旋转字符操作串示例详解

    目录 旋转字符串 字符串左旋 题前认知: 暴力移位: 三步翻转: 判断字符串旋转 题前认知 字符串追加判断 旋转字符串 字符串左旋 实现一个函数,可以左旋字符串中的k个字符. 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 题前认知: 一个字符串如果就定死了.eg:char arr[]="dfdf"什么的那多没意思,一点都没有人机交互的感觉,(虽然现在人机交互适合个体,不适合集群,但也是比死板的定死字符串舒服) 所以字符串得是我们可输入的,才有可玩性,玩的不

  • C语言关于自定义数据类型之枚举和联合体详解

    目录 前言 枚举 枚举类型的定义 枚举类型的优点 枚举类型的使用 枚举中需要注意的点 联合体 联合体类型的定义 联合体的特点 联合体的使用 联合体存在内存对齐 结语 前言 在C语言的自定义数据类型中,除了我们最为常用的结构体之外,还有两个比较少用的自定义数据类型,分别为枚举和联合体(也可以称为共用体). 今天,我们一起看学习一下相关的知识吧! 枚举 什么是枚举? 顾名思义,就是一一列举,把所有的情况,所有的取值,一一列举出来. 在我们生活中,有不少的东西是可以全部列举出来的. 如一个星期有七天,

  • C语言实现字符串字符反向排列的方法详解

    目录 前言 非递归方法 1.循环实现 2.函数实现 递归方法 1.递归方法 2.递归方法 小结 前言 重点的话说在前头,注意不是逆序打印 今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种方法来解决 题目具体内容如下: 编写一个函数(递归实现) 实现:将参数字符串中的字符反向排列,不是逆序打印. 要求:不能使用C函数库中的字符串操作函数 但是这里我不会仅仅局限于题目的要求 非递归方法 1.循环实现 1.1循环实现(sizeof) #include <stdio.h> int mai

随机推荐