🌟菜鸟主页:@晨非辰的主页

👀学习专栏:《C语言学习》

💪学习阶段:C语言方向初学者

名言欣赏:"编程的本质是理解问题,然后把它分解成可执行的步骤。"


目录

1. 字符分类函数

2. 字符转换函数

3. strlen函数

3.1 strlen函数使用示范

3.2 strlen的返回值

  3.3 模拟实现strlen函数

4. strcpy函数(格式符隐式解引用)

4.1 strcpy函数使用示范

4.2 模拟实现strcpy函数

5. strcat函数

5.1 strcat函数使用示范

5.2 模拟实现strcat函数


1. 字符分类函数

--在C语言中有一系列函数专门做字符分类判断一个字符属于什么类型的字符。

--以下函数都需要包含头文件:<ctype.h>

       

--这些函数的使用方式十分相似,下面就将一个函数为例解释: islower 函数

int lower(int a);

        --函数判断字母是否为小写字母,是-返回非0整数,不是-返回0;

--练习:通过代码将字符串中的小写字母转换为大写字母:

#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Im a Chinese!";int i = 0;;while (arr[i]){if (islower(arr[i])){arr[i] -= 32;//大写字母Ascll码值与小写字母差32}printf("%c", arr[i]);i++;}return 0;
}

2. 字符转换函数

--除了上述的字符分类函数,还有这实现字符之间转换的字符转化函数;

--使用时包含头文件:<ctype.h>

int tolower(int c);  将传进去的大写字母转换为小写字母;
int toupper(int c);  将传进去的小写字母转换为大写字母;

--有了这两个函数就可以直接实现大小写转换,不用在+-32进行。

--练习:通过代码利用上述两个函数实现将字符串中的小写字符转换为大写:

int main()
{char arr[] = "Im a Chinese!";int i = 0;while (arr[i]){if (islower(arr[i])){arr[i] = toupper(arr[i]);}printf("%c", arr[i]);i++;}return 0;
}

3. strlen函数

size_t strlen (const char* str);

--介绍: 

  • 参数: str —— 指向 '\0' 结尾的字符串的指针;

  • 返回值: size_t 类型的无符号整数,表示字符串的长度(不含 '\0' );

  • 核心功能:计算字符串长度从起始地址开始遍历,直到遇到 '\0' 结束。

3.1 strlen函数使用示范

--使用须知:

  •  字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' );
  • 参数指向的字符串必须要以 '\0' 结束;
  • 注意函数的返回值为 size_t,是无符号的( 易错 );
  • strlen的使用需要包含头文件<string.h>;
#include <string.h>
int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));return 0;
}

3.2 strlen的返回值

--为什么说返回值 size_t类型易错?请看下面代码:

#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0)//一般认为输出<=,但实际不是{printf(">\n")else{printf("<=\n");}return 0;
}

        --一般认为上面 3-6 输出 <=,但实际不是 ,输出 > :因为函数返回类型为无符号整型,所以运算结果也为无符号整型(>=0);想让它符合我们的认知,可以将类型强转为 int :

int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if ((int)strlen(str2) - (int)strlen(str1) > 0){printf(">\n");}else{printf("<=\n");}return 0;
}

  3.3 模拟实现strlen函数

 --下面将呈现三种方法·,其中两种方式在前面已经见过:

--方式1:计算器

#include <assert.h>
size_t strlen(char* str)
{int count = 0;int i = 0;assert(str != NULL);while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abcdef";size_t re = strlen(arr);printf("%d\n", re);return 0;
}

--方式2:指针-指针(参考:4.2部分--#C语言——学习攻略:深挖指针路线(一))

size_t my_strlen(char* str)
{assert(str != NULL);char* p = str;while (*str){str++;}return str - p;
}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%zd\n", ret);return 0;
}

--方式3:函数递归

size_t my_strlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + my_strlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = my_strlen(arr);printf("%d", ret);return 0;
}


4. strcpy函数(格式符隐式解引用)

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

--介绍:

  • 功能:字符串拷贝,将源头(src)的字符串拷贝到目标(dest )空间中,拷贝到源头字符串中的 '\0' 为止;

  • 返回值:strcpy函数返回的目标空间的起始地址;

  • 参数: destination指针,指向目的地空间;source指针,指向源头数据。

4.1 strcpy函数使用示范

使用须知——

  • 源字符串必须以 '\0' 结束;
  • 会将源字符串中的 '\0' 拷贝到目标空间;
  • 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空;
  • 目标空间必须可修改(字符串数组),比如常量字符串无法修改; 
  • 使用需要包含头文件<string.h>;
int main()
{char arr1[] = "hello";char arr2[20] = { 0 };char* ret = strcpy(arr2, arr1);printf("%s\n", ret);    无需解引用,%s 自动处理return 0;
}

隐式解引用:

--对于为什么输出 ret 不使用 %p :当要输出指针指向的内容时 %s 格式符本质上会隐式解引用指针,


4.2 模拟实现strcpy函数

void my_strcpy(char* dest, char* src)
{while (*dest++ = *src++){;}}
int main()
{char arr1[] = "hello world!";char arr2[] = "*************";my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;
}

5. strcat函数

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

--介绍:

  • 功能:字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中;
  • 参数:destination指针,指向目的地空间;source指针,指向源头数据;
  • 返回值:strcat函数返回的目标空间的起始地址;

5.1 strcat函数使用示范

使用须知——

  • 源字符串必须以 '\0' 结束;
  • 目标字符串中也得有 \0 ,否则无法知道追加从哪开始;
  • 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空;
  • 目标空间必须可修改;
  • 使用需要包含头文件<string.h>;
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);return 0;
}

5.2 模拟实现strcat函数

char* mystrcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest){dest++;}//找到目标字符串中的\0,明确从那里开始追加。while ((*dest++ = *src++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}

结语:本篇文章到此结束,下一篇将会为大家呈现字符函数和字符串函数的剩余内容,如果这篇文章对你的学习有帮助的话,欢迎一起讨论学习,你这么帅、这么美给个三连吧~~~

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

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

相关文章

(吃饭)质数时间

题目描述如果把一年之中的某个时间写作 a 月 b 日 c 时 d 分 e 秒的形式&#xff0c;当这五个数都为质数时&#xff0c;我们把这样的时间叫做质数时间&#xff0c;现已知起始时刻是 2022 年的 a 月 b 日 c 时 d 分 e 秒&#xff0c;终止时刻是 2022 年的 u 月 v 日 w 时 x 分 y…

【RK3568 RTC 驱动开发详解】

RK3568 RTC 驱动开发详解一、Linux RTC 子系统架构​二、设备树配置​三、驱动四、时间相关命令实时时钟&#xff08;RTC&#xff09;是嵌入式系统中不可或缺的硬件模块&#xff0c;负责在系统断电后继续计时&#xff0c;为设备提供稳定的时间基准。本文将以瑞芯微 RK3568 平台…

文本编码检测库`chardet` 和 `uchardet`对比使用示例及注意事项

在处理未知编码的二进制数据时&#xff0c;chardet 和 uchardet 是两个非常实用的字符编码自动检测库&#xff0c;尤其适用于从卫星通信、文件、网络流等来源获取的未标明编码的文本数据。一、chardet&#xff08;Python版&#xff09; ✅ 简介 chardet 是一个用 Python 编写的…

[Windows]Postman-app官方历史版本下载方法

Postman-app官方历史版本下载方法最新版&历史版本官网地址最新版本下载历史版本下载禁止自动更新方法Postman最新版安装后必须要登录才能使用某些特定功能&#xff0c;多有不便&#xff0c;因此花了点时间整理了一下历史版本如何下载的方法&#xff0c;链接均为官网链接&am…

【Spring Boot 快速入门】三、分层解耦

目录分层解耦案例&#xff1a;将 emp.xml 中的数据解析并响应三层架构分层解耦IOC & DI 入门IOC 详解DI 详解分层解耦 案例&#xff1a;将 emp.xml 中的数据解析并响应 emp.xml 内容如下&#xff1a; <emps><emp><name>Tom</name><age>18…

井云科技2D交互数字人:让智能服务触手可及的实用方案

在如今的数字化时代&#xff0c;智能交互已成为各行业提升服务质量的重要方向。而井云 2D 交互数字人系统凭借其独特的技术优势&#xff0c;正逐渐成为众多企业实现智能服务升级的优选。它无需复杂的操作和高昂的成本&#xff0c;就能让数字人在各类线下场景中发挥重要作用&…

本地部署VMware ESXi,并实现无公网IP远程访问管理服务器

ESXi&#xff08;VMware ESXi&#xff09;是VMware公司推出的一款企业级虚拟化平台&#xff0c;基于裸机&#xff08;bare-metal&#xff09;安装的虚拟化操作系统。它可以在一台物理服务器上运行多个虚拟机&#xff0c;广泛应用于数据中心和云计算环境中。很多公司为了方便管理…

让科技之光,温暖银龄岁月——智绅科技“智慧养老进社区”星城国际站温情纪实

七月的风&#xff0c;带着夏日的热情&#xff0c;轻轻拂过邯郸星城国际社区葱郁的绿意。2025年7月30日&#xff0c;一个以“幸福晚景&#xff0c;乐享银龄—智慧养老进社区”为主题的活动&#xff0c;如一股暖流&#xff0c;浸润了社区的长者们。智绅科技怀揣着“科技赋能养老&…

Java单元测试和设计模式

单元测试 . 测试分类 什么是测试? 测试的目的是尽可能多的发现软件中存在的BUG,而不是为了隐藏BUG。事实上测试有很多种类,比如:边界测试,压力测试,性能测试等 黑盒测试 黑盒测试也叫功能测试,主要关注软件每个功能是否实现,并不关注软件代码是否有错误;测试人员…

UOS统信桌面系统解决编译错误:C compiler cc is not found指南

一、系统环境 1.操作系统版本2.编译环境 PC:~$ gcc --version gcc (Uos 8.3.0.13-deepin1) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY o…

深入理解 Docker 容器网络:为什么用 host 网络模式能解决连通性问题?

Docker 已经成为现代应用部署的标配&#xff0c;大家都知道它的网络隔离做得很好&#xff0c;既安全又灵活。不过&#xff0c;在实际用 Docker 部署服务的过程中&#xff0c;相信很多人都遇到过这样的情况&#xff1a;主机上能连通的外部服务&#xff0c;一到容器里却死活连不上…

Spring Boot 异常处理:从全局捕获到优化用户体验!

全文目录&#xff1a;开篇语**前言****1. Spring Boot 异常处理的基本概念****2. 使用 ExceptionHandler 局部处理异常****示例&#xff1a;局部异常处理****优化建议&#xff1a;****3. 使用 ControllerAdvice 和 RestControllerAdvice 进行全局异常处理****示例&#xff1a;全…

vue3.0 + TypeScript 中使用 axios 同时进行二次封装

项目背景是vite搭建的vue3.0 TypeScript 的项目&#xff0c;需要统一处理和统一维护就对axios进行了二次封装 axios的安装 npm install axios定义http文件夹然后内部定义index.ts文件&#xff0c;内部开始封装 import axios, {type AxiosInstance} from "axios";…

ESP32- 项目应用1 音乐播放器之sd的驱动配置 #1

音乐播放器 ESP32- 项目应用1 音乐播放器之sd的驱动配置 #1 文章目录 音乐播放器 1 sd卡介绍 1.1 SDCARD介绍 1.2 物理结构 1.3 协议说明 1.4 sd 卡模式 1.5 数据模式 1.6 sdio 初始化流程 1.7 SPI 模式下的 SD 卡初始化 2 原理图 2.1 sd原理图 2.2 esp32的接口 3 代码配置 3.…

Vue.js 指令系统完全指南:深入理解 v- 指令

Vue.js 的指令系统是其最强大的特性之一&#xff0c;通过以 v- 开头的特殊属性&#xff0c;我们可以在模板中声明式地绑定底层Vue实例的数据。本文将深入讲解Vue中最重要的指令&#xff0c;帮助掌握Vue的核心功能。 文章目录1. v-model&#xff1a;双向数据绑定的核心基本用法修…

计算机分类汇总大全

前端部分有 Node.js、ActionScript、Swift、TypeScript、Webpack、JavaScript。需要分别详细说明它们的定义、特点、应用场景、优缺点等。比如 Node.js&#xff0c;要提到它的运行环境、事件驱动、非阻塞 I/O&#xff0c;适合的应用如 API 服务、实时应用&#xff0c;以及常用框…

模拟链路滤波器设计一些细节

目录 原设计思路剖析 300M带宽仿真与计算 原设计思路剖析 滤波器设计的一些细节,以下为ADS54J60模拟链路的一些问题设计原理图 实际电路设计如上所示,但是实际bom并未按此设计,根据实际的BOM明细以及ADC使用说明书,可以间接理解原设计者的设计初衷,是将ADC的一部分特性…

CatBoost 完整解析:类别特征友好的梯度提升框架

1️⃣ 什么是 CatBoost&#xff1f;CatBoost&#xff08;Categorial Boosting&#xff09;是由 Yandex&#xff08;俄罗斯搜索引擎公司&#xff09;开源的梯度提升框架&#xff0c;专为类别特征处理优化。核心特点&#xff1a;无需手动 one-hot / LabelEncoding&#xff0c;原生…

NDBmysql-cluster集群部署脚本

NDB(Network Database)是MySQL Cluster的核心存储引擎,专为高可用性、高吞吐量、分布式数据存储设计,采用内存计算+磁盘持久化架构,支持跨节点数据分片与自动冗余,适用于对实时性和可靠性要求严苛的业务场景(如金融交易、电信计费、实时分析等)。 今天大白鼠就分享构建…

计算机网络中的socket是什么?编程语言中的socket编程又是什么?python的socket编程又该如何用?

1. 计算机网络中的 Socket 是什么&#xff1f; 想象一下电话系统&#xff1a; 电话插座 (Socket)&#xff1a; 是墙上的一个物理接口&#xff0c;它本身不是通话&#xff0c;但它是建立通话连接的端点。你需要把电话线插进插座才能打电话。通话 (Connection)&#xff1a; 是两台…