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;但是再次尝试还是一…

基于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…

“遥感新纪元: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;、模…

适合上班族的副业: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大…

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; 在迭代生成的每个工具…

AI绘画怎么用?详细教程在这里!

AI绘画是一种利用人工智能技术来创作艺术作品的方式。以下是一个详细的AI绘画的详细教程&#xff0c;介绍AI绘画怎么用? 1. 选择合适的AI绘画工具&#xff1a;市面上有许多AI绘画工具供用户选择&#xff0c;如建e网AI、DeepArt、DALL-E等。用户可以根据自己的需求和兴趣&#…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColor…

Tab组件的编写与动态日期的函数封装

src\components\Tab\Icon.vue 底部导航栏子组件。 <template><router-link :to"path" class"tab-icon"><i class"icon">{{iconText}}</i><p class"text"><slot>{{ tabText }}</slot></…

2024.3.12 C++

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height) 定义公有成员函数初始化函数:void init(int w, int h)更改宽度的函数:set w(int w)更改高度的函数:set h(int h)输出该矩形的周长和面积函数:void show() #include <iostream>using nam…

高项-项目整合管理

项目整合管理的目标 资源分配平衡竞争性需求研究各种备选方法裁剪过程以实现项目目标管理各个项目管理知识域之间的依赖关系 项目整合管理的过程 制定项目章程制定项目管理计划指导与管理项目工作管理项目知识监控项目工作实施整体变更控制结束项目或阶段 七个过程和五大过…

Servlet的book图书表格实现(使用原生js实现)

作业内容&#xff1a; 1 建立一个book.html,实现图书入库提交 整体参考效果如下: 数据提交后&#xff0c;以窗口弹出数据结果&#xff0c;如: 2 使用正则表达式验证ISBN为x-x-x格式&#xff0c;图书名不低于2个字符&#xff0c;作者不能为空&#xff0c;单价在【10-100】之间…

NASA和IBM联合开发的 2022 年多时相土地分类数据集

简介 美国国家航空航天局&#xff08;NASA&#xff09;和国际商业机器公司&#xff08;IBM&#xff09;合作&#xff0c;利用大规模卫星和遥感数据&#xff0c;包括大地遥感卫星和哨兵-2 号&#xff08;HLS&#xff09;数据&#xff0c;创建了地球观测人工智能基础模型。通过奉…