当前位置: 首页 > article >正文

C语言进阶——3字符函数和字符串函数(2)

8 strsrt

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

查找子字符串

  • 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
  • 匹配过程不包括终止 null 字符,但会在此处停止。

8.1 库函数strstr使用

#include<stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdefba";
	char arr2[] = "def";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

在这里插入图片描述

它会返回找到相同字符串的地址,所以可以直接打印。

8.2strstr库函数模拟实现

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


char* my_strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	if (*arr2 == '\0')
	{
		return NULL;
	}
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = arr1;
	while (*cp)
	{
		s1 = cp;
		s2 = arr2;
		while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cp;
		}
		cp++;
	}
		
	return NULL;
}

int main()
{
	char arr1[] = "abcdefba";
	char arr2[] = "def";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

在这里插入图片描述

9 strtok

char * strtok ( char * str, const char * sep );
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
    并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
    中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

9.1 库函数strtok的使用

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

int main()
{
	char arr[] = "192.168.10.123";
	char* p = ".";
	char buf[20] = { 0 };
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

在这里插入图片描述

10 strerror

C语言的库函数在运行的时候,如果发生错误,就会将错误码存在一个变量中,这个变量是:errno
错误码是一些数字:1 2 3 4 5
我们需要讲错误码翻译成错误信息
所以就有了strerror()这个函数

char * strerror ( int errnum );
  • 返回错误码,所对应的错误信息。
  1. 使用示例1
    在这里插入图片描述
    2.使用示例2

我们这里使用了一个fopen()函数
在这里插入图片描述


#include <errno.h>

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");//fopen会在vs的当前文件夹中去寻找文件,我们当前文件夹没有创建这个文件
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		//perror("fopen");
		return 1;
	}
	//读文件
	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

在这里插入图片描述

11 字符分类函数

函数如果它的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘f’,换行"n’,回车,制表符‘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任何可打印字符,包括图形字符和空白字符

示例1
在这里插入图片描述

示例2
在这里插入图片描述

示例3
在这里插入图片描述

12 memcpy

void * memcpy ( void * destination, const void * source, size_t num );
  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。

12.1 memcpy模拟实现

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

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}


int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1 , 16);
	return 0;
}

在这里插入图片描述

13 memmove

void * memmove ( void * destination, const void * source, size_t num );
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

13.1 memmove模拟实现

分析
在这里插入图片描述

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src)
	{
		//前-->后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
    else
    {
	   //后->前
	    while (num--)
	    {
		    *((char*)dest + num) = *((char*)src + num);
	    }
    }

    return ret;
}


int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1+3, arr1 , 16);
	return 0;
}

在这里插入图片描述

13 memcmp

int memcmp ( const void * ptr1, 
 const void * ptr2, 
 size_t num );
  • 比较从ptr1和ptr2指针开始的num个字节
  • 返回值如下:
    在这里插入图片描述

http://www.kler.cn/a/519146.html

相关文章:

  • Go语言开发项目文件规范
  • 数据的秘密:如何用大数据分析挖掘商业价值
  • 高频 SQL 50 题(基础版)_620. 有趣的电影
  • OLMo:开启AI研究新纪元的开放利器
  • Python “字典” 实战案例:5个项目开发实例
  • 物业管理平台系统提升社区智能化服务效率与管理水平
  • 即梦(Dreamina)技术浅析(二):后端AI服务
  • 蓝桥杯算法赛第25场月赛
  • Flutter:搜索页,搜索bar封装
  • mysql_use_result的概念和使用案例
  • OpenCV:二值化与自适应阈值
  • Chameleon(变色龙) 跨平台编译C文件,并一次性生成多个平台的可执行文件
  • JavaScript系列(43)--依赖注入系统实现详解
  • [极客大挑战 2019]BuyFlag1
  • vue高级组件封装 element组件二次封装
  • Maui学习笔记- SQLite简单使用案例
  • 基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
  • 一次StarRocks分析的经历
  • 第25章 测试驱动开发模式深度剖析
  • unity 粒子系统实现碰撞检测(collision)且使粒子不受力
  • tcp/ip协议和ip协议,tcp/ip协议 ip协议
  • 探索JavaScript:网页设计中的创意与实践
  • leetcode——翻转链表(java)
  • (回溯分割)leetcode93 复原IP地址
  • AI学习(vscode+deepseek+cline)
  • INMP441一款微型电容式麦克风(MEMS麦克风)