字符和字符串操作函数总结

news2024/10/6 2:20:06

索引

  • 一 . 字符操作函数
    • 1. 字符分类函数
    • 2. 字符转换函数
  • 二 . 字符串操作函数
    • 长度不受限制的字符串操作函数
      • 1. strcpy函数的使用和模拟实现
      • 2. strcat函数的使用和模拟实现
      • 3. strcmp函数的使用和模拟实现
    • 长度受限制的字符串操作函数
      • 1. strncpy函数的使用
      • 2. strncat函数的使用
      • 3. strncmp函数的使用
    • 其它常用字符串操作函数
      • 1. strlen函数的使用和模拟实现
      • 2. strstr函数的使用和模拟实现
      • 3. strtok函数的使用
      • 4. strerror函数的使用
        • perror函数
  • 三 . 总结


正文开始

一 . 字符操作函数

1. 字符分类函数

c语言中有一系列的函数是专门做字符分类的, 也就是一个字符是属于什么类型的字符的, 这些函数的使用都需要包含一个头文件是 ctype.h

函数如下:

在这里插入图片描述

这些函数的使用方法非常类似 , 我们就列举一个函数 , 其它非常的类似:

int islower ( int c );

islower 是能够判断参数部分的 c 是否是小写字母的。
通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回
0。

写一个代码, 将字符串中的小写字母转为大写, 其他字符不变

#include<stdio.h>
#include<ctype.h>
int main()
{
	char str[] = "TEst StrinG.\n";
	int i = 0;
	while (str[i])
	{
		if (islower(str[i]))//当然这里也可以不用判断,直接转换,只不过代码运行效率不高
		{
			str[i] = str[i] - 32;
		}
		i++;
	}
	printf("%s\n", str);
	return 0;
}

2. 字符转换函数

c语言提供了2个字符转换函数:

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写  
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写 

上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用 tolower 函数。

#include<stdio.h>
#include<ctype.h>
int main()
{
	char str[] = "TEst StrinG.\n";
	int i = 0;
	while (str[i])
	{
		if (islower(str[i]))
		{
			str[i] = toupper(str[i]);
		}
		i++;
	}
	printf("%s\n", str);
	return 0;
}

二 . 字符串操作函数

长度不受限制的字符串操作函数

1. strcpy函数的使用和模拟实现

函数介绍:

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

• 源字符串必须以 '\0' 结束。
• 会将源字符串中的 '\0' 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可修改。
• 学会模拟实现

strcpy函数的模拟实现:

char* my_strcpy(char* str1, char* str2)//把str2中的内容拷贝到str1中
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* s = str1;
	while (*str2 != '\0') {
		*str1 = *str2;
		str1++;
		str2++;
	}
	*str1 = *str2;
	return s;
}
//优化版本

char* my_strcpy(char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* s = str1;
	while (*str1++ = *str2++)
		;
	return s;
}

2. strcat函数的使用和模拟实现

函数介绍:

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

• 源字符串必须以 '\0' 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。

strcat函数的模拟实现

char* my_strcat(char* str1,const char* str2)//把str2中的数据拼接到str1
{
	assert(str1 && str2);
	char* s = str1;
	while (*str1 != '\0')
		str1++;
	while (*str1++ = *str2++)
		;
	return s;
}

int main() 
{
	char str[20] = "abcdefg";
	char* str2 = "hijklmn";
	char* ret = my_strcat(str,str2);
	printf("%s\n", ret);
	return 0;
}

3. strcmp函数的使用和模拟实现

函数介绍:

int strcmp (const char * str1, const char * str2);
◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
◦ 第⼀个字符串等于第⼆个字符串,则返回0
◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
◦ 那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩

strcmp函数的模拟实现

int my_strcmp(const char *p1,const char *p2)
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	while (*p1 == *p2)
	{
		p1++;
		p2++;
		if (*p1 == '\0')
			return 0;
	}
	
	if (*p1 > *p2)
		return 1;
	else return -1;
}

int main()
{
	int ret = 0;
	char* p1 = "abcdefg";
	char* p2 = "abcdq";
	ret = my_strcmp(p1, p2);
	printf("%d\n", ret);
	return 0;
}

长度受限制的字符串操作函数

1. strncpy函数的使用

函数介绍:

char * strncpy ( char * destination, const char * source, size_t num );

• 拷⻉num个字符从源字符串到⽬标空间。
• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
//strncpy :拷贝num个字符从源字符串拷贝到目标空间,不拷贝\0,要拷贝多少字符就拷贝多
//少字符,源字符串不够就在目标字符
//串之后追加'\0',直到num个,返回str1目标字符串的地址
int main()
{
	char str1[10] = { 0 };
	char* str2 = "1234567890";
	strncpy(str1, str2, 5);
	printf("%s\n", str1);
	return 0;
}

运行结果:

在这里插入图片描述

2. strncat函数的使用

函数介绍:

char * strncat ( char * destination, const char * source, size_t num );
//strncat 字符串拼接,将源字符串的前num个字符追加到目标字符串结尾, 再追加一个'\0',
//如果源字符串指向的
//字符串长度小于num的时候, 只会将字符串中到'\0'的内容追加到destination指向的字符
//串末尾,返回目标字符串str1的地址
int main()
{
	char str1[10] = "abcf";
	char str2[10] = "12345";
	strncat(str1, str2, 3);
	printf("%s\n", str1);
}

3. strncmp函数的使用

函数介绍:

int strncmp ( const char * str1, const char * str2, size_t num );

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀
样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

在这里插入图片描述

其它常用字符串操作函数

1. strlen函数的使用和模拟实现

函数介绍:

size_t strlen ( const char * str );

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
• strlen的使⽤需要包含头⽂件
• 学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

代码结果:

在这里插入图片描述

strlen函数的模拟实现:

#include<stdio.h>
#include<assert.h>

//模拟实现strlen 1(计数器版本)

size_t my_strlen1(const char* p)
{	
	assert(p);
	int count = 0;//计数器
	while (*p != '\0')
	{
		p++;
		count++;
	}
	return count;
}

//模拟实现strlen 2(函数递归版本)
size_t my_strlen2(const char* p)
{
	assert(p);
	if (*p == '\0')
		return 0;
	else
		return 1 + my_strlen2(p + 1);
}

//模拟实现strlen 3(指针-指针版本)
size_t my_strlen3(const char* p)
{
	assert(p);
	char* s = p;
	while(*s != '\0')
		s++;
	return s - p;
}

int main() 
{
	char* str = "abcdefg";
	int ret1 = my_strlen1(str);
	int ret2 = my_strlen2(str); 
	int ret3 = my_strlen3(str);
	printf("%d\n", ret1);
	printf("%d\n", ret2);
	printf("%d\n", ret3);
	return 0;
}

2. strstr函数的使用和模拟实现

函数介绍:

char * strstr ( const char * str1, const char * str2);
//函数返回str2在str1中第一次出现的位置
//字符串中的比较匹配不包含\0,以\0作为结束标志
#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	strncpy(pch, "sample", 6);
	printf("%s\n", str);
	return 0;
}

strstr函数的模拟实现

char* my_strstr(const char* p1,const char* p2)
{
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = p1;
	if (p2 == NULL)
	{
		return p1;
	}
	while (*cur) {
		s1 = cur;
		s2 = p2;
		while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0')
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;
}

int main()
{	
	char* p1 = "abcdefg";
	char* p2 = "cde";
	char *ret = my_strstr(p1, p2);
	printf("%s\n", ret);
	return 0;
}

3. strtok函数的使用

函数介绍:

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

4. strerror函数的使用

函数介绍:

char * strerror ( int errnum );

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息 
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++) {
		printf("%s\n", strerror(i));
	}
	return 0;
}

在vs下运行结果如下:

No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error
No such device or address
Arg list too long
Exec format error
Bad file descriptor
No child processes

实际运用举例:

int main()
{
	FILE* pFile;
	pFile = fopen("text,txt", "r");
	if (pFile == NULL)
		printf("Error opening file text.txt: %s\n", strerror(errno));
	return 0;
}

运行结果:

在这里插入图片描述

perror函数

函数介绍:

perror函数直接将错误信息打印出来, perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。

int main()
{
	FILE* pFile;
	pFile = fopen("text,txt", "r");
	if (pFile == NULL)
		perror("Error opening file text.txt");
	return 0;
}

运行结果:

在这里插入图片描述

三 . 总结

字符函数和字符串函数是编程中常用的函数,能够帮助我们处理和操作文本数据,提高程序的灵活性和效率。在实际编程中,灵活运用字符函数和字符串函数可以简化代码逻辑,提高代码的可读性和可维护性.
如果觉得此文章有用的话记得 点赞 收藏 , 如有错误 ,恳请指正 感谢各位读者 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1592241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP地址修改步骤详解

IP地址是网络设备在网络中的标识&#xff0c;它决定了设备在网络中的位置与可访问性。然而&#xff0c;在某些情况下&#xff0c;我们可能需要修改IP地址&#xff0c;以满足特定的网络需求或解决网络问题。虎观代理将详细介绍IP地址的修改步骤&#xff0c;帮助读者更好地理解和…

Springboot+Vue项目-基于Java+MySQL的社区团购系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

21 标准错误

标准输出重定向关闭无数据 下面的代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {close(1);i…

意得辑真不错

意得辑真不错&#xff0c;85喆优惠码延长到25.12.31了我用editage意得辑润色SCI已经第4年了&#xff0c;今天他家的学术支持老师让我写几句感受&#xff0c;那我真的感受太多了。因为下单太多一度被导师怀疑是在他家套经费。22年刚读博同时润色了三篇&#xff0c;被导师叫到办公…

新手做抖店需要掌握的技巧!这些运营方法,保证让你快速出单!

哈喽~我是电商月月 新手做抖店做不好&#xff1f;除了没努力的原因&#xff0c;还有一点&#xff0c;就是缺少运营的方法&#xff01; 今天我就给大家普及几个运营过程中非常重要的技巧&#xff01; 这都是我在运营中总结出来的能提高出单率的干货&#xff0c;新手建议收藏 …

HBuilderX 中开发vue,引入百度地图获取当前ip地址定位

实现功能&#xff1a;使用百度地图获取IP地址&#xff0c;定位到当前位置 参考文档地址&#xff1a;MapVGL | 快速入门 一、在有外网的情况下&#xff0c;常规引入百度地图的方法如下&#xff1a; 1、在index.html中引入 <script src"//api.map.baidu.com/api?v1.…

将Visio绘图导出PDF文件,使其自适应大小,并去掉导入Latex的边框显示

问题描述 将Visio绘图导成pdf文件&#xff0c;首先在Visio绘图如下&#xff1a; 如果直接导出或者另存为pdf文件&#xff0c;则会发现pdf文件是整个页面大小&#xff0c;而不是图片大小。而且在导入latex等排版工具现实时&#xff0c;会显示边框。 问题解决 1.调整Visio中的页…

openstack-镜像服务 3

Glance镜像服务 创建glacnce数据库 创建glance用户并创建服务实体及api端点 安装glance软件包 修改配置文件 同步到数据库 设置开机自启并查看日志目录 使用测试镜像验证服务

【MIT6.S081】Lab3: page tables(详细解答版)

实验内容网址&#xff1a;https://xv6.dgs.zone/labs/requirements/lab3.html 本实验的代码分支&#xff1a;https://gitee.com/dragonlalala/xv6-labs-2020/tree/pgtbl2/ Print a page table 关键点&#xff1a;递归、三级页表 思路&#xff1a; 用上图来解释三级页表的原理最…

Unity开发Android,关于StreamingAssets和持久化路径坑点

一、Android平台下&#xff0c;使用File去读取StreamingAssets目录下的文件无法读到 原因&#xff1a;在Android平台下&#xff0c;Unity打包出来的文件&#xff0c;StreamingAssets目录会被压缩成一个jar的包&#xff0c;因此使用File无法读取到路径。 解决&#xff1a;可以使…

Redis的双写一致性问题

双写一致性问题 1.先删除缓存或者先删除数据库都可能出现脏数据。 2.删除两次缓存&#xff0c;可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离&#xff0c;读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

[INS-30014]无法检查指定的位置是否位于 CFS 上

文章目录 一、具体错误二、通用解决方案1、可能的问题原因2、解决方案3、常见原因之hosts文件配置问题hosts配置方法hosts文件不可编辑解决办法 一、具体错误 在安装ORACLE19c的时候&#xff0c;出现无法检查指定的位置是否位于CFS上 二、通用解决方案 1、可能的问题原因 遇…

GB/T 28181标准中的错误码,国标28181中可能出现的SIP协议相关的错误码及其含义

目录 一、GB/T 28181标准介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;关键内容和特点 1. 系统架构&#xff1a; 2. 设备接入&#xff1a; 3. 网络通信&#xff1a; 4. 业务功能&#xff1a; 5. 安全保护&#xff1a; 6. 平台管理&#xff1a; &a…

【核心完整复现】基于目标级联法的微网群多主体分布式优化调度

1 主要内容 之前发布了华电学报的复现程序《基于目标级联法的微网群多主体分布式优化调度》&#xff0c;具体链接为【防骗版】基于目标级联法的微网群多主体分布式优化调度&#xff0c;虽然对模型及结果进行了复现&#xff0c;但是部分模型细节和参数并没有完全实现&#xff0…

伪造CSRF

【1】什么是CSRF ​ CSRF全称是跨站请求伪造。这是一种网络攻击方式&#xff0c;攻击者通过伪造用户请求来达到非法操作的目的。 ​ CSRF 就像是攻击者利用了被攻击者的身份&#xff0c;通过伪装成被攻击者的身份&#xff0c;在被攻击者不知情的情况下执行操作。 ​ 攻击者通…

工业项目中你连PLM系统都没见过?

什么是 PLM 软件&#xff1f; PLM 软件是用于管理全球供应链中产品或服务全生命周期环节的解决方案。它包括从物料、零部件、产品、文档、规定、工程变更单到质量工作流的数据管理。 PLM 的发展历史 从最初的产品设计管理到如今的数字化转型和智能化生产&#xff0c;PLM 在不断…

三小时零基础入门微信扫码点餐小程序 手把手带你开发一款云开发版点餐软件,店铺地图导航,外卖小程序,用户端和后厨端都有

从今天开始带领大家实现一款云开发版的点餐小程序 视频讲解&#xff1a;《云开发后台微信扫码点餐小程序cms网页管理后台》 技术选型 1&#xff0c;前端 微信小程序原生框架cssJavaScript 2&#xff0c;管理后台 云开发Cms内容管理系统web网页 3&#xff0c;数据后台 小…

ifconfig用法 、默认掩码

文章目录 概述2. ifconfig(尽量别用&#xff0c;已废弃)2.1 配置地址2.1.1 默认掩码 2.2 查看功能2.2.1 ifconfig 查看不含禁用的网卡2.2.2 ifconfig -a 查看含禁用的网卡2.2.3 ip a 2.3 启用、禁用网卡2.3.1 ifconfig eth1 up、 ifconfig eth1 down2.3.2 ifdown eth0、ifip et…

基于微信公众号,搭建一套简单的电商支付环境(下)-- 微信公众号的对接

一、接着上文 上文把部署情况介绍了&#xff0c;侧重于网络及代理&#xff0c;本文选择把微信公众号的对接实现介绍一下。 还是那句话&#xff0c;微信官方的文档已非常详细&#xff0c;这里先摘抄一些重要的概念。 其次&#xff0c;待对接微信公众号的接口众多&#xff0c;…

面试算法-165-随机链表的复制

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…