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

C语言中字符串相关操作函数

长度

strlen

size_t strlen(const char *str)

功能:返回字符串长度

strnlen

size_t strnlen(const char *str, size_t maxlen)

功能:返回字符串长度,如果长度大于maxlen,返回maxlen

设置

memset

void *memset(void *s, int c, size_t count)

功能:将s指向的地址,连续count,设置为c。(注意步进为sizeof(char)

拼接

strcat

char *strcat(char *dest, const char *src)

功能:将源字符串拼接到目标字符串后面

strncat

char *strncat(char *dest, const char *src, size_t count)

功能:将源字符串拼接到目标字符串后面,指定最多拷贝长度

strlcat

char *strlcat(char *dest, const char *src, size_t count)

功能:将源字符串拼接到目标字符串后面,指定目标缓冲区总大小为count

函数实现:

size_t strlcat(char *dest, const char *src, size_t count)
{
	size_t dsize = strlen(dest);
	size_t len = strlen(src);
	size_t res = dsize + len;

	/* This would be a bug */
	BUG_ON(dsize >= count);

	dest += dsize;
	count -= dsize;
	if (len >= count)
		len = count-1;
	memcpy(dest, src, len);
	dest[len] = 0;
	return res;
}

比较

strncasecmp

int strncasecmp(const char *s1, const char *s2, size_t len)

功能:不区分大小写、限制长度的字符串比较

strcasecmp

int strcasecmp(const char *s1, const char *s2)

功能:不区分大小写的字符串比较

strcmp

int strcmp(const char *cs, const char *ct)

功能:比较两个字符串

strncmp

int strncmp(const char *cs, const char *ct, size_t count)

功能:比较指定长度的两个字符串

memcmp

__visible int memcmp(const void *cs, const void *ct, size_t count)

功能:比较指定长度的两片内存区域内容是否相等

bcmp–>memcmp

# define __visible __attribute__((__externally_visible__))

拷贝

strcpy

char *strcpy(char *dest, const char *src)

功能:将源字符串拷贝到目的地址,空字符结束

可能存在目标地址内存空间小,内存访问越界

strcpy

char *strncpy(char *dest, const char *src, size_t count)

功能:将源字符串拷贝到目的地址,空字符或者拷够count个字符结束

不会主动在拷贝完加尾0

memcpy

void *memcpy(void *dest, const void *src, size_t count)

功能:从源空间拷贝count大小的目标空间

memmove

void *memmove(void *dest, const void *src, size_t count)

功能:从源空间拷贝count大小的目标空间

与memcpy()不同,memmove()可以处理重叠区域

在实现中如果dest<src,则正向copy,否则从后向前copy,防止有重叠区

strlcpy

size_t strlcpy(char *dest, const char *src, size_t size)

功能:将一个字符串拷贝到目标缓冲区

在缓冲区大小size不为0时进行拷贝,最多拷贝size-1个字符,最后添加一个尾\0,

stpcpy

char *stpcpy(char *__restrict__ dest, const char *__restrict__ src)

功能:字符串拷贝

区别于strcpy在返回值上,stpcpy返回目标字符串的末尾地址。

strdup

char *strdup(const char *str)

功能:将传入字符串,拷贝一份返回

注意:返回的地址是在函数内部有malloc的,使用完记着free

函数实现位置:source/tools/include/nolibc/string.h

static __attribute__((unused))
char *strndup(const char *str, size_t maxlen)
{
	size_t len;
	char *ret;

	len = strnlen(str, maxlen);
	ret = malloc(len + 1);
	if (__builtin_expect(ret != NULL, 1)) {
		memcpy(ret, str, len);
		ret[len] = '\0';
	}

	return ret;
}

strndup

char *strndup(const char *str, size_t maxlen)

strdup一样,不过多指定了一个最大长度

查找

strchr

char *strchr(const char *s, int c)

功能:在给定字符串查找是否存在字符c,存在则返回首次出现的位置,不存在返回NULL

strnchr

char *strrchr(const char *s, size_t count, int c)

功能:在给定字符串查找是否存在字符c,存在则返回第一次出现的位置,不存在返回NULL,限制查找次数count

strchrnul

char *strchrnul(const char *s, int c)

功能:在给定字符串查找是否存在字符c,存在则返回第一次出现的位置,不存在返回s结尾的位置。

strrchr

char *strrchr(const char *s, int c)

功能:在给定字符串查找是否存在字符c,存在则返回最后一次出现的位置,不存在返回NULL

memchr

void *memchr(const void *s, int c, size_t n)

功能:在给定内存空间查找是否存在字符c,存在则返回首次出现的位置,不存在返回NULL

strstr

char *strstr(const char *s1, const char *s2)

功能:在s1中查找s2,找到返回在s1中的位置,否则返回NULL

函数实现:

char *strstr(const char *s1, const char *s2)
{
	size_t l1, l2;

	l2 = strlen(s2);
	if (!l2)
		return (char *)s1;
	l1 = strlen(s1);
	while (l1 >= l2) {
		l1--;
		if (!memcmp(s1, s2, l2))
			return (char *)s1;
		s1++;
	}
	return NULL;
}

strnstr

char *strnstr(const char *s1, const char *s2, size_t len)

功能:在s1中查找s2指定找len个长度,找到返回在s1中的位置,否则返回NULL

strspn

size_t strspn(const char *s, const char *accept)

功能:该函数返回 s中第一个不在字符串accept中出现的字符下标(初始段匹配长度 )。

函数实现:

size_t strspn(const char *s, const char *accept)
{
	const char *p;

	for (p = s; *p != '\0'; ++p) {
		if (!strchr(accept, *p))
			break;
	}
	return p - s;
}

strcspn

size_t strcspn(const char *s, const char *reject)

功能:该函数返回 s中第一个在字符串reject中出现的字符下标(初始段不匹配长度 )。

函数实现:

size_t strcspn(const char *s, const char *reject)
{
	const char *p;

	for (p = s; *p != '\0'; ++p) {
		if (strchr(reject, *p))
			break;
	}
	return p - s;
}

strpbrk

char *strpbrk(const char *cs, const char *ct)

功能:查找在字符串cs中首次出现ct中任一字符的位置

函数实现:

char *strpbrk(const char *cs, const char *ct)
{
	const char *sc1, *sc2;

	for (sc1 = cs; *sc1 != '\0'; ++sc1) {
		for (sc2 = ct; *sc2 != '\0'; ++sc2) {
			if (*sc1 == *sc2)
				return (char *)sc1;
		}
	}
	return NULL;
}

分割

char *strsep(char **s, const char *ct)

函数功能:s为要分解的字符串,delim为分隔符字符串。

函数实现:

char *strsep(char **s, const char *ct)
{
	char *sbegin = *s;
	char *end;

	if (sbegin == NULL)
		return NULL;

	end = strpbrk(sbegin, ct);
	if (end)
		*end++ = '\0';
	*s = end;
	return sbegin;
}

strtok

char *strtok( char *str, const char *delim)

char *strtok( char *restrict str, const char *restrict delim );(C99开始)

功能:返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针

注意:此函数是破坏性的:它写入’\0’字符到字符串str的元素

相关文章:

  • linux篇【11】:linux下的线程<后序>
  • 让学前端不再害怕英语单词(二)
  • Java培训教程给bean的属性赋值
  • Socket套接字(Java)
  • 机器人工程考研难易主观感受和客观数据
  • Bio-Helix丨Bio-Helix艾美捷Ponceaus S染色液说明书
  • 【Spring(四)】Spring基于注解的配置方式
  • 【Git】一文带你入门Git分布式版本控制系统(简介,安装,Linux命令)
  • AWS EKS 创建k8s生产环境实例
  • java计算机毕业设计html5健身房信息管理系统源码+mysql数据库+系统+lw文档+部署
  • 面向开发者的开源低代码开发工具,强烈推荐!
  • 制作一个简单HTML宠物猫网页(HTML+CSS)
  • Python题库(含答案)
  • 有效 QA 过程测量的 10 个基本指标
  • HTML小游戏11 —— 横版恐龙大冒险游戏(附完整源码)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【comparator, comparable】小总结
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Invalidate和postInvalidate的区别
  • Java深入 - 深入理解Java集合
  • js
  • magento2项目上线注意事项
  • Node项目之评分系统(二)- 数据库设计
  • SpringBoot几种定时任务的实现方式
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 订阅Forge Viewer所有的事件
  • 跨域
  • 免费小说阅读小程序
  • 批量截取pdf文件
  • 如何学习JavaEE,项目又该如何做?
  • 时间复杂度与空间复杂度分析
  • 使用 Docker 部署 Spring Boot项目
  • 在Unity中实现一个简单的消息管理器
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Python 之网络式编程
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • (9)STL算法之逆转旋转
  • (BFS)hdoj2377-Bus Pass
  • (C++20) consteval立即函数
  • (c语言)strcpy函数用法
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)出版业改革:该死的死,该生的生
  • (二)JAVA使用POI操作excel
  • (一) springboot详细介绍
  • (转)nsfocus-绿盟科技笔试题目
  • (转)shell调试方法
  • (转)可以带来幸福的一本书
  • .Net FrameWork总结
  • .NET Remoting学习笔记(三)信道
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net8 Blazor 尝鲜
  • .NET成年了,然后呢?
  • .NET导入Excel数据
  • @property括号内属性讲解