C语言快速入门之字符函数和字符串函数

一.字符分类函数和字符转换函数

C语言中有一系列的函数专门做字符分类的,就是区分一个字符是属于什么类型的,头文件是

#include <ctype.h>

以下是具体函数:

这些函数的使用方法类似,我们写出一些代码来举例。

例如,我们实验以下islower()函数,它是接受一个字符,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。

int main()
{char a = 'a';char b = 'Q';char c = '5';printf("%d\n", islower(a));printf("%d\n", islower(b));printf("%d\n", islower(c));return 0;
}

现在,我们写出一个代码,将字符串中的小写字母转大写,其他字符不变

int main()
{char arr[] = "Hello World";printf("%s\n", arr);int con = strlen(arr);int i = 0;for (i = 0; i < con; i++){if (islower(arr[i])){arr[i] -= 32;}}printf("%s\n", arr);return 0;
}

C语言提供了两种字符转换函数

int tolower( int c); //将参数传进去的大写字母转小写
int toupper( int c); //将参数传进去的小写字母转大写

上面的代码中,我们进行的转换是利用ASCII码,现在我们也可以利用转换函数来更改啦

int main()
{char arr[] = "Hello World";printf("%s\n", arr);int con = strlen(arr);int i = 0;for (i = 0; i < con; i++){if (islower(arr[i])){arr[i] = toupper(arr[i]);}}printf("%s\n", arr);return 0;
}

二.字符串函数

1.strlen的使用和模拟实现

strlen是计算字符串长度的函数,以'\0'为结束,返回一个无符号整型size_t,使用时需要包含头文件string.h

现在我们来模拟实现strlen函数吧

int My_strlen(const char* arr)
{int count = 0;	//计数assert(arr != NULL);	//断言,防止出错while (*arr != '\0'){count++;arr++;}return count;
}

这是最常规的方法,那么,我们能否不创建额外的变量来实现strlen函数呢?这需要运用到函数的递归

int My_strlen_unint(char* arr)
{assert(arr != NULL);if (*arr == '\0')return 0;elsereturn 1 + My_strlen_unint(arr+1);}

2.strcpy的使用和实现

这会把一个字符串拷贝到另一个字符串中,然后返回字符串首元素地址

int main()
{char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxxxx";char* p = "xxxxxxxxxxxxxxxxxxxxxxx";	//常量字符串,不能更改my_strcpy(arr2,arr1);printf("%s\n", arr2);return 0;
}

使用方式中,arr1是拷贝内容,arr2是更改的字符串,需要注意,我们在定义时不能是常量的字符串,目的地必须要足够大来存放内容且可以更改,同时,    原字符串要有\0,会把原\0拷贝过来

现在我们来模拟实现吧

char* my_strcpy(char* dest, const char* src)
{char* ret;assert(dest && src);//拷贝\0之前的内容while (*dest++ = *src++){;}*dest = *src;	//拷贝\0return ret;
}

3.strcat的使用和模拟

它的作用是来连接字符串

int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

他会把arr2放在arr1的后面,最后返回arr2的地址,需要注意的是:源字符串必须以 '\0' 结束。 ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。⽬标空间必须可修改。

现在我们来模拟实现吧。

char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;//1.找目标空间的\0while (*dest != '\0'){dest++;}//2.拷贝while (*dest++ = *src++){;//空语句}return ret;
}

但是,我们如果是自己给自己追加,例如:

int main1()
{char arr1[20] = "abcdef";my_strcat(arr1, arr1);printf("%s\n", arr1);	return 0;
}

上述的代码就会出错,实际是导致了死循环,使得程序崩溃,我们写的只是参考代码

4.strcmp的使用和模拟

strcmp是实现两个字符串的比较,一般来说,两个字符串是不能比较大小的,例如:

char arr1[] = "abcdef";
char arr2[] = "abcdef";
if (arr1 == arr2)	//不正确的,这里比较的是地址
{}if ("abcdef" == "abc")	//这样也是不正确的,比较的也是地址
{}

这两个if都是不正确的,因为他们传入的是地址,比较没有意义

如果要比较两个字符串的内容,需要使用strcmp,会依次来进行比较,最后,函数返回值类型为int,前者大>0,后者大<0,相等返回0

//函数返回值为int,前者大>0,后者大<0,相等返回0
char arr1[] = "abcdef";
char arr2[] = "abq";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);

现在,我们来模拟实现吧

int my_strcmp(const char* arr1,const char* arr2)
{assert(arr1 && arr2);while (*arr1 == *arr2){arr1++;arr2++;}return *arr1 - *arr2;
}

5.strncpy strncat strncmp

strcpy strcat strcmp 是长度不受限制的字符串函数

strncpy strncat strncmp是长度受限制的字符串函数

int main()
{char arr1[] = "abcdef";char arr2[20] = "xxxxxxxxxxxxxx";strncpy(arr2, arr1, 4);printf("%s\n", arr2);strncpy(arr2, arr1, 8);printf("%s\n", arr2);//把n个字符拷贝过去,如果不够,补足\0return 0;
}
int main()
{char arr1[] = "abcdef";char arr2[20] = "xx\0xxxxxxxxxxx";strncat(arr2, arr1, 8);printf("%s\n", arr2);//把n个字符追加过去,后面会再加一个\0,如果不够,就不管了return 0;
}
int main()
{char arr1[] = "abcdef";char arr2[] = "abqedfss";int ret = strncmp(arr1, arr2, 6);printf("%d\n", ret);return 0;
}

6.strstr的使用和模拟

在一个字符串str1中查找另一个字符串str2是否出现过,如果出现,返回第一次str2出现的位置,如果没出现,返回空指针

例如:

int main()
{char arr1[] = "this is an apple\n";const char* p = "is";const char* p2 = "appl";char* ret = strstr(arr1, p);char* ret2 = strstr(arr1, p2);printf("%s\n", ret);printf("%s\n", ret2);return 0;
}

有时候,我们不一定能找到,

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

现在,我们来模拟实现吧

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

7.strtok的使用

提取出由分隔符分隔的串    char* strtok(char* str,const char* sep);str是指定的一个字符串,包含了0个或多个由sep字符串中的一个或多个做分隔符分割的标记

int main8()
{char arr[] = "xianyu@qq.com";char arr2[20] = { 0 };strcpy(arr2, arr);		//会更改字符串	xianyu\0qq\0comconst char* sep = "@.";char* ret = NULL;ret	= strtok(arr, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);return 0;
}

同时,我们也可以利用循环来实现

int main8()
{char arr[] = "xianyu@qq.com";char arr2[20] = { 0 };strcpy(arr2, arr);		//会更改字符串	xianyu\0qq\0comconst char* sep = "@.";char* ret = NULL;for (ret = strtok(arr, sep); ret != NULL; ret = strtok(NULL,sep)){printf("%s\n", ret);}return 0;
}

8.strerror函数的使用

int main()
{//fopen以只读的方式打开文件,文件不存在,打开失败FILE* pf = fopen("test.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));perror("zhangsan");//perror有能力直接打印错误信息,先打印传给perror的字符串,:空格,再打印错误码return 1;}fclose(pf);return 0;
}

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

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

相关文章

解决ChatGPT发送消息没有反应

ChatGPT发消息没反应 今天照常使用ChatGPT来帮忙码代码&#xff0c;结果发现发出去的消息完全没有反应&#xff0c;即不给我处理&#xff0c;也没有抱任何的错误&#xff0c;按浏览器刷新&#xff0c;看起来很正常&#xff0c;可以查看历史对话&#xff0c;但是再次尝试还是一…

【笔记】道路不平度的功率谱密度计算时的问题

参考: 1. 道路空间功率谱密度与时间功率谱密度(笔记) 2. 功率谱密度PSD(笔记) 1.定义 (1)通常把路面相对于基准平面的高度q,沿道路走向长度l的变化q(l)称为路面纵断面曲线或不平度函数 (2)为了表述车辆振动时路面输入的不平度,采用路面功率谱密度描述其统计特性。 (…

基于springboot+vue的线上教育系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 现在大家的生活方式正在被计算机的发展慢慢改变着&#xff0c;学习方式也逐渐由书本走向荧幕,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变&#xff0c;人们的娱乐方式不仅仅…

2023年第三届中国高校大数据挑战赛第二场赛题C:用户对博物馆评论的情感分析(附上代码与详细视频讲解)

问题重述&#xff1a; 博物馆是公共文化服务体系的重要组成部分。国家文物局发布&#xff0c; 2021 年我国新增备案博物馆 395 家&#xff0c;备案博物馆总数达 6183 家&#xff0c;排名全球前列&#xff1b;5605 家博物馆实现免费开放&#xff0c;占比达 90%以上&#xff1b;…

Dynamic Wallpaper v17.4 mac版 动态视频壁纸 兼容 M1/M2

Dynamic Wallpaper Engine 是一款适用于 Mac 电脑的视频动态壁纸&#xff0c; 告别单调的静态壁纸&#xff0c;拥抱活泼的动态壁纸。内置在线视频素材库&#xff0c;一键下载应用&#xff0c;也可导入本地视频&#xff0c;同时可以将视频设置为您的电脑屏保。 应用介绍 Dynam…

mysql 事务 及 Spring事务 初论

1.事务概述 事务是一种机制&#xff0c;用以维护数据库确保数据的完整性和一致性。。事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。MySQL中主要使用INN…

记一次面试经历

这段时间正好是金三银四的黄金时间段&#xff0c;正好这段时间也有很多企业有hc在招人&#xff0c;本文主要就是来聊聊我这段时间的面试经历吧。目前我是从北京投上海的岗位&#xff0c;现在有两家保底的offer。 简历投递 简历这块是基础也是必要的门槛&#xff0c;有没有面试…

Unity3D 基于AStar地图的摇杆控制角色详解

前言 Unity3D提供了丰富的工具和功能&#xff0c;可以帮助开发者快速制作出高质量的游戏。其中&#xff0c;AStar算法是一种常用的路径规划算法&#xff0c;可以帮助游戏中的角色找到最短路径。在本文中&#xff0c;我们将介绍如何在Unity3D中基于AStar地图实现摇杆控制角色移…

计算机等级考试:信息安全技术 知识点七

1、URG标志位说明紧急指针有效:ACK标志位说明确认序号字段有效:PSH标志位表示请求接收端;主机尽快将数据包交付应用层&#xff0c;RST标志位表示出现差错&#xff0c;必须释TCP连接重新建立新连接:SYN标志位说明建立一个同步连接:FIN标志位用于释放TCP连接。 2、Whois是Intern…

“遥感新纪元:GPT技术引领地球观测的智慧革新“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能…

设计模式八:观察者模式

文章目录 1、观察者模式2、示例3、spring中的观察者模式3.1 spring观察者模式的使用3.2 spring观察者模式原理解析 1、观察者模式 观察者模式&#xff08;Observer Design Pattern&#xff09;,也叫做发布订阅模式&#xff08;Publish-Subscribe Design Pattern&#xff09;、模…

wsl-oraclelinux -bash: nvidia-smi: command not found

-bash: nvidia-smi: command not found 1. 问题2. 解决方法 1. 问题 在 wsl Oracle Linux 中&#xff0c;执行 nvidia-smi 报下面错误&#xff0c; -bash: nvidia-smi: command not found2. 解决方法 export PATH/usr/lib/wsl/lib:$PATH完结&#xff01;

适合上班族的副业:steam游戏搬砖1天3小时,月入8K

互联网新时代&#xff0c;做副业的人越来越多。如果能充分利用下班后的时间&#xff0c;还真能赚到不少钱。steam游戏搬砖项目就是这样一个非常适合上班的副业&#xff0c;只要用心去操作&#xff0c;一个月至少收入两三千&#xff0c;多的轻松上万。 steam游戏搬砖项目其实做的…

2.4 RK3399项目开发实录-使用 SD 卡升级固件(物联技术666)

通过百度网盘分享的文件&#xff1a;嵌入式物联网单片… 链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd8qo1 提取码:8qo1 复制这段内容打开「百度网盘APP 即可获取」 本文主要介绍了如何将实现使用MicroSD卡&#xff0c;更新主板上的固件。但也仅限于固件小于4G大…

PYTHON 120道题目详解(106-108)

106.Python中的json模块可以用于哪些场景&#xff1f;如何使用&#xff1f; Python中的json模块主要用于处理JSON&#xff08;JavaScript Object Notation&#xff09;数据格式。JSON是一种轻量级的数据交换格式&#xff0c;它基于ECMAScript的一个子集&#xff0c;采用完全独立…

RabbitMQ - 01 - 快速入门

目录 界面总览 创建队列 选择默认交换机 发布消息 查看消息 通过实现以下目标快速入门 界面总览 RabbitMQ Management 界面总览 通道: 传输消息的通道 路由: 接收和路由(分发)消息 队列: 存储消息 消息队列的流程: 生产者将消息发送给路由,路由分发消息到各个队列存储…

超级实用导出各种excel,简单粗暴,无需多言

1、加入准备的工具类 package com.ly.cloud.utils.exportUtil;import java.util.Map;public interface TemplateRenderer {Writable render(Map<String, Object> dataSource) throws Throwable;}package com.ly.cloud.utils.exportUtil;import java.util.Map;public int…

Python之禅——跟老吕学Python编程

Python之禅——跟老吕学Python编程 Python之禅1.**Beautiful is better than ugly.**2.**Explicit is better than implicit.**3.**Simple is better than complex.**4.**Complex is better than complicated.**5.**Flat is better than nested.**6.**Spare is better than den…

【Tailwind + Vue3】100行代码手写一个客服组件

【Tailwind Vue3】100行代码手写一个客服组件 通常在官网页面上&#xff0c;都会有一个在右下角的客服小组件&#xff0c;有几个按钮&#xff0c;显示电话&#xff0c;微信等信息&#xff1a; 主要有以下几个难点&#xff1a; 动态类名绑定&#xff1a; 在迭代生成的每个工具…

Log4j如何支持多线程环境?你如何优化Log4j的性能?

Log4j如何支持多线程环境&#xff1f; Log4j 通过其内部设计来支持多线程环境&#xff0c;确保在多线程应用程序中能够安全地使用。以下是 Log4j 支持多线程环境的一些关键方面&#xff1a; 线程安全性&#xff1a; Log4j 的 Logger 类和 Appender 类都是设计为线程安全的。这…