C语言:ctype和string库中的部分常用函数的应用和实现

        在编程过程中,我们经常要处理字符和字符串,C语言标准库中就提供了一系列的库函数,便于我们操作库函数。

字符分类函数

        C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

 这些函数的使⽤⽅法⾮常类似,我们一一个函数为例,各位理解后可以去类比使用:

        islower 是一个能够判断参数部分的 形参是否是⼩写字⺟的函数。通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回 0。

练习:写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

法一:

#include<stdio.h>
int main()
{char arr[] = "What can I say, man!!!";int i = 0;while (arr[i] != '\0'){if (arr[i] <= 122 && arr[i] >= 97){arr[i] -= 32;}i++;}printf("%s\n", arr);return 0;
}

        本段代码利用的使小写字母的ascii值的范围进行操作,我们可以利用islower函数。

法二:

#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = "What can I say, man!!!";int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] -= 32;}putchar();i++;}printf("%s\n", arr);return 0;
}

字符转换函数

C语言中由两个字符转换函数:

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

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

了解了字符转换函数的用法后,我们可以修改一下上面的练习:

#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = "What can I say, man!!!";int i = 0;char c;while (arr[i] != '\0'){c = arr[i];if (islower(arr[i])){c = toupper(arr[i]);}putchar(c);i++;}return 0;
}

strlen函数的使用和模拟实现

strlen

函数原型:size_t strlen ( const char * str );

strlen的使用

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef";int ret = strlen(arr);printf("%d\n",ret);//6return 0;
}

 注意事项:

• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
• strlen的使⽤需要包含头⽂件 string.h

strlen函数的模拟实现

法一:计数器法

//(创建变量)计数器版本
#include<stdio.h>
#include<assert.h>
void my_strlen(const char* str)
{assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}printf("%d\n", count);
}
int main()
{char arr[] = "abcdef";my_strlen(arr);return 0;
}

法二:指针-指针(结果的绝对值使两指针之间的元素个数)

#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{assert(str);char* ret = str;while (*str != '\0')str++;return str - ret;
}
int main()
{char arr[] = "abcdef";int ret = my_strlen(arr);printf("%d\n", ret);return 0;
}

法三:递归法

//递归法(无需创建变量)
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{assert(str);if (*str == '\0')return 0;else{return 1 + my_strlen(str + 1);}
}
int main()
{char arr[] = "abcdef";int ret = my_strlen(arr);printf("%d\n", ret);return 0;
}

strcpy函数的使用和模拟实现

strcpy的使用

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "************";char arr2[] = "world";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

运行结果:

 注意事项:

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

strcpy的模拟实现

#include<stdio.h>
#include<assert.h>
//原版本
//char* my_strcpy(char* dest, const char* src)
//{
//	char* ret = dest;
//	while (*src != '\0')
//	{
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	return ret;
//}
优化版本
char* my_strcpy(char* dest, const char* sorce)
{assert(dest && sorce);char* ret = dest;while (*dest++ = *sorce++);//结果相同但极大缩减了代码return ret;
}
int main()
{char arr1[20] = "*********";char arr2[] = "hello world";char* ret = my_strcpy(arr1, arr2);printf("%s\n", ret);return 0;
}

strcat函数的使用和模拟实现

strcat的使用

//strcat
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello ";char arr2[] = "world";char* ret = strcat(arr1, arr2);printf("%s\n", ret);return 0;
}

 注意事项:

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

模拟实现strcat函数

//strcat函数的模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while (*dest != '\0')dest++;while (*dest++ = *src++);return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";char* ret = my_strcat(arr1, arr2);printf("%s\n", ret);return 0;
}

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

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

相关文章

Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费

证书准备&#xff1a;springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换&#xff0c;因为kafka里面是jks 需要通过openssl进行转换。 证书处理&#xff1a; KeyStore 用于存储客户端的证…

分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测

分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测 目录 分类预测 | Matlab基于TTAO-CNN-LSTM-Attention三角拓扑聚合优化算法优化卷积神经网络-长短期记忆网络-注意力机制的数据分类预测分类效果基…

ABC344 A-E题解

文章目录 A题目AC Code&#xff1a; B题目AC Code&#xff1a; C题目AC Code&#xff1a; D题目AC Code&#xff1a; E题目AC Code&#xff1a; 不易不难&#xff0c;写到5题很简单&#xff0c;但是要有足够的思维能力。 A 题目 我们用一个 flag 变量记录我们是不是在两个竖…

python根据文件路径获取文件名

如果你想要获取文件路径中的文件名但不包括后缀名&#xff0c;你可以使用os.path.splitext()函数来分割文件名和后缀名&#xff0c;然后只取第一个部分。下面是一个例子&#xff1a; import os# 假设你有一个文件路径 file_path "/path/to/your/file.txt"# 使用os.…

人工智能、深度学习、机器学习书目推荐

AI入门书籍 人工智能基础 《Python神经网络编程》[英]塔里克拉希德(TariqRashid)中国工信部出版社入门强推&#xff0c;非常清晰的描述基于神经网络的人工智能基本原理&#xff0c;入门必看书目《统计学习方法》李航清华大学出版社人工智能必备数学基础&#xff0c;需要一定的…

【MacOS 上安装 Homebrew 】讲解

macOS 安装 Homebrew macOS 上安装 Homebrew 是一个相对简单的过程&#xff0c;Homebrew 是一款开源的软件包管理工具&#xff0c;它可以让你在 Mac 上轻松安装、更新和管理软件包。以下是安装 Homebrew 的步骤&#xff1a; 1. 打开终端&#xff1a; 你可以通过在 Finder 中…

CCF-CSP真题201403-2《窗口》(结构体+数组)

问题描述 在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。   当你点击屏幕上一个点的时候,你就选择了处于被点击位置的…

前端发展史与优秀编程语言

前端开发是互联网技术领域中的一个重要分支&#xff0c;负责构建用户直接交互的网页和应用程序界面。随着互联网的发展&#xff0c;前端技术经历了多个阶段的演变&#xff0c;从最初的简单静态页面到如今的复杂交互式应用&#xff0c;不断推动着用户体验的提升和网页功能的丰富…

Vue3 重置覆盖 reactive 数组数据的方法

核心要点&#xff1a; 通过splice删除原数组内的所有数据&#xff0c;并添加新的数据进去。潜在影响&#xff1a;大数据量下&#xff0c;splice重置数组和 ref 的.value重新赋值重置数组&#xff0c;哪个耗时短还需自行测试。 通过 splice 传入0 和 Infinity 来删除原数组从头…

【Python】进阶学习:OpenCV--一文详解cv2.namedWindow()

【Python】进阶学习&#xff1a;OpenCV–一文详解cv2.namedWindow() &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

C++椭圆检测论文复现 Ubuntu 22.04+Vscode+opencv3.4

复现的代码 本博客旨在复现论文《An Efficient High-quality Ellipse Detection》&#xff0c;该文章本来只有Matlab的代码实现&#xff0c;后来被islands翻译成了c 库&#xff0c;大家可以参考islands发在知乎上的文章高质量椭圆检测库&#xff0c;C的代码链接。 使用环境 U…

整合生成型AI战略:从宏观思维到小步实践

“整合生成型AI战略&#xff1a;从宏观思维到小步实践” 在这篇文章中&#xff0c;我们探讨了将生成型AI和大型语言模型融入企业核心业务的战略开发方法。我们的方法基于敏捷开发原则&#xff0c;技术专家和数据科学家需要采纳商业思维&#xff0c;而执行官则需理解生成型AI和…

ROS2动作通信的实现

文章目录 1.动作通信的概念及应用场景1.1 概念1.2 应用场景 2.准备工作3.动作通信的实现3.1 动作通信接口消息3.2 服务端实现3.3 客户端实现3.4 编译及运行 1.动作通信的概念及应用场景 1.1 概念 动作通信适用于长时间运行的任务。就结构而言动作通信由目标、反馈和结果三部分…

吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)

在本实验中&#xff0c;您将对比回归和分类。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data from plt_one_addpt_onclick import plt_one_addpt_onclick plt.style.use(./deeplearning.mplstyle)jupy…

Java实战:Spring Boot利用MinIO实现文件切片上传

本文将详细介绍如何在 Spring Boot 应用程序中使用 MinIO 实现文件切片极速上传技术。我们将深入探讨 MinIO 的概念、文件切片上传的原理&#xff0c;以及如何使用 Spring Boot 和 MinIO 实现文件切片上传和合并。 1. 引言 在现代的互联网应用中&#xff0c;文件上传是一个常…

第三百九十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

JavaWeb--Maven

一&#xff1a;概述 1.简介 Maven 是专门用于管理和构建 Java 项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布 …… &#xff09; 提供了一套…

Minio搭建文件服务器

目录 一、Minio使用&#x1f355;1.1 Minio介绍1.2 Minio安装1.3 Minio入门 二、创建后端服务&#x1f953;2.1创建一个SpringBoot项目2.2 代码实现2.2.1 FileUploadController2.3.2 FileUploadService2.3.3 MinioProperties2.3.4 MinioServerApplication2.2.4 配置文件内容 三…

如何使用固定公网地址SFTP远程传输文件至安卓Termux本地目录?

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

misc40

下载附件&#xff0c;发现只有第三个wav文件需要密码&#xff0c;其他都可以看 打开 conversion.txt 二进制转十进制得到202013 开 一张普通的二维码.png&#xff0c;直接扫不出结果。 010查看图片尾部发现 Brainfuck 编码 解码得到&#xff1a; 和谐民主和谐文明和谐和谐和谐…