C语言 字符函数和字符串函数(1)

目录

1.字符分类函数

2.字符转换函数

3.strlen的使用和模拟实现

4.strcpy的使用和模拟实现


在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提

供了一系列库函数,接下来我们就学习一下这些函数。

1.字符分类函数

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

这些函数的使用都需要包含一个头文件是 <ctype.h> 

这些函数的使用方法非常类似,我们就讲解一个函数的实例,其他的非常类似:

int islower ( int c );

islower 是能够判断参数部分的  c  是否是小写字母的。

通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返

回0。

练习:

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

#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c -= 32;putchar(c);i++;}return 0;
}

代码解释:

1. 头文件
-  #include <stdio.h>  :要用  putchar  输出字符,得包含这个标准输入输出头文件。
-  #include <ctype.h>  : islower  函数能判断字符是不是小写字母,它在这个字符处理头文件里。
2.  main  函数
- 程序从这里开始。 int main  表示返回整数, return 0  说明程序正常结束。
3. 变量
-  int i = 0  :当索引,用来挨个访问字符串字符。
-  char str[] = "Test String.\n"  :存要处理的字符串。
-  char c  :临时存从字符串取出的字符。
4. 循环处理
-  while (str[i])  :只要字符不是结束符  '\0'  ,就循环。
-  c = str[i]  :拿出当前字符放  c  里。
-  if (islower(c))  :判断  c  是不是小写字母,是就执行下面。
-  c -= 32  :小写字母ASCII码减32 ,变成大写字母。
-  putchar(c)  :把处理后的字符打印出来。
-  i++  :准备处理下一个字符。

2.字符转换函数

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

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

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

数。

#include <stdio.h>
#include <ctype.h>
int main ()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c = toupper(c);putchar(c);i++;}return 0;
}

代码解释:

1. 功能:把字符串里的小写字母转成大写并输出。
2. 头文件:
-  stdio.h :用  putchar  打印字符。
-  ctype.h :用  islower  查小写字母, toupper  转大写。
3. 变量:
-  i :当“指针”,逐个访问字符串字符。
-  str :存要处理的字符串(比如  "Test String.\n" )。
-  c :临时存当前字符。
4. 过程:
- 逐个字符检查,是小写字母就转大写,然后打印。
- 直到遇到字符串结尾的  \0  才停止。

3.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;
}

代码解释:

1. 功能:比较两个字符串的长度并输出结果。
2. 头文件:
-  stdio.h :用于输入输出( printf )。
-  string.h :用于使用字符串长度函数  strlen 。
3. 变量:
-  str1  指向字符串  "abcdef" (长度6)。
-  str2  指向字符串  "bbb" (长度3)。
4. 逻辑:
- 计算  str2  长度减  str1  长度: 3-6 = -3 。
- 由于  -3  不大于0,输出  "srt1>str2" (注意代码中  srt1  是拼写错误,应为  str1 )。

strlen的模拟实现:
 
方式1:

//计数器方式
int my_strlen(const char * str)
{int count = 0;assert(str);while(*str){count++;str++;}return count;
}

代码解释:

1. 函数功能:这个函数 my_strlen 用来计算传入字符串的长度,类似C语言标准库函数  strlen。
2. 参数 const char * str  表示传入一个指向字符常量的指针,即传入字符串的首地址, const  修饰意味着函数内不能通过这个指针修改字符串内容。
3. 变量 int count=0;定义一个整型变量 count 作为计数器,初始化为 0 ,用来统计字符串字符个数。
4. 断言 assert(str); 是一个断言宏,作用是在程序运行时检查 str 指针是否为空。如果 str 为空,程序会终止并报错,这能防止后续空指针解引用导致的程序崩溃。
5. 循环计数:
-  while(*str):只要当前指针指向的字符( *str )不是字符串结束符 '\0' ,就执行循环体。
-  count++;:每循环一次,计数器  count  加  1  ,统计字符数量。
-  str++;:将指针向后移动一位,指向下一个字符,以便继续检查后续字符。
6. 返回值:return count;当循环结束,说明已经遍历完字符串,此时返回计数器 count 的值,也就是字符串的长度(不包含结束符'\0')。

4.strcpy的模拟和使用

char* strcpy(char * destination, const char * source );
  • - 源字符串必须以  '\0'  结束。
  • - 会将源字符串中的  '\0'  拷贝到目标空间。
  • - 目标空间必须足够大,以确保能存放源字符串。
  • - 目标空间必须可修改。
  • - 学会模拟实现。
#include <stdio.h>
#include <string.h>int main() {char source[] = "Hello, world!";  // 源字符串char destination[20];  // 目标字符串数组,空间要足够容纳源字符串// 使用strcpy函数将源字符串拷贝到目标字符串strcpy(destination, source); printf("拷贝后的字符串: %s\n", destination);return 0;
}

代码解释:

1. 头文件引入
-  #include<stdio.h>:用于使用输入输出函数,如printf。
-  #include<string.h>: strcpy 函数的声明在这个头文件中,所以要引入。
2. 定义字符串
-  char source[] = "Hello, world!"; : 定义并初始化源字符串。
-  char destination[20];  :定义目标字符串数组,这里大小设为 20 ,确保能容纳源字符串(包括结束符'\0')。
3. 使用strcpy函数strcpy(destination, source); : 将源字符串source拷贝到目标字符串destination,包括字符串结束符'\0'。
4. 输出结果printf("拷贝后的字符串: %s\n", destination); : 使用printf函数输出拷贝后的目标字符串。

本篇内容先到这里,像这种函数还有多个,接下来再为大家一一显示,希望大家能深入理解,感谢

大家的观看!

 

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

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

相关文章

MySQL 中如何进行 SQL 调优?

在MySQL中进行SQL调优是一个系统性工程&#xff0c;需结合索引优化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。以下是具体优化方法及案例说明&#xff1a; 一、索引优化&#xff1a;精准提速的关键 索引类型选择 普通索引&#xff1a;加速频繁查询的列&…

OpenCV图像金字塔详解:原理、实现与应用

一、什么是图像金字塔&#xff1f; 图像金字塔是图像处理中一种重要的多尺度表示方法&#xff0c;它通过对图像进行重复的平滑和降采样&#xff08;或上采样&#xff09;操作&#xff0c;生成一系列分辨率逐渐降低&#xff08;或升高&#xff09;的图像集合。这种结构形似金字…

收集飞花令碎片——C语言分支与循环语句(上)

前言 Hello,各位码友&#xff0c;本章将会给大家带来C语言的分支与循环整章串讲&#xff0c;这一张的内容分为基础知识和程序练习两个部分 希望通过这一章能够带大家更好地去掌握C语言的分支与循环语句 大家一起努力吧 C语言分支与循环语句&#xff08;基础知识&#xff09; C…

嵌入式硬件篇---TOF|PID

文章目录 前言1. 硬件准备主控芯片ToF模块1.VL53L0X2.TFmini 执行机构&#xff1a;电机舵机其他 2. 硬件连接(1) VL53L0X&#xff08;IC接口&#xff09;(2) TFmini&#xff08;串口通信&#xff09; 3. ToF模块初始化与数据读取(1) VL53L0X&#xff08;基于HAL库&#xff09;(…

PCB设计实践(十二)PCB设计电容选型:功能、材质、规则

在PCB设计中&#xff0c;电容作为基础元件承担着滤波、储能、去耦、耦合等核心功能。其分类与使用规则直接影响电路稳定性、抗干扰能力和信号完整性。本文从工程实践角度系统梳理PCB设计中电容的五大分类、选型规范及布局布线规则&#xff0c;帮助设计者构建科学的电容应用体系…

vue2关闭eslint

在项目根目录下找到 vue.config.js 文件。如果没有该文件&#xff0c;可以直接在项目根目录创建一个。 2. 添加 lintOnSave: false 配置 module.exports {lintOnSave: false };

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时&#xff0c;可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况&#xff0c;例如&#xff1a; 一个部门有多个员工一个订单有多个订单项一个博客有多个…

基于Stable Diffusion XL模型进行文本生成图像的训练

基于Stable Diffusion XL模型进行文本生成图像的训练 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…

基于React的高德地图api教程001:初始化地图

文章目录 1、初始化地图1.1 创建react项目1.2 可视化地图1.3 设置卫星地图1.4 添加开关开启3D地图1.5 代码下载1、初始化地图 1.1 创建react项目 创建geodeapi项目: npx create-react-app gaodeapi安装高德地图包: npm install @amap/amap-jsapi-loader1.2 可视化地图 在…

uniapp使用npm下载

uniapp的项目在使用HBuilder X创建时是不会有node_modules文件夹的&#xff0c;如下图所示&#xff1a; 但是uni-app不管基于哪个框架&#xff0c;它内部一定是有node.js的&#xff0c;否则没有办法去实现框架层面的一些东西&#xff0c;只是说它略微有点差异。具体差异表现在…

轻量在线工具箱系统源码 附教程

源码介绍 轻量在线工具箱系统源码,直接扔服务器 修改config/config.php文件里面的数据库 后台账号admin 密码admin123 本工具是AI写的 所以工具均是第三方接口直接写的。 需要加工具直接自己找接口写好扔到goju目录 后台自动读取 效果预览 源码获取 轻量在线工具箱系统源…

图解gpt之Seq2Seq架构与序列到序列模型

今天深入探讨如何构建更强大的序列到序列模型&#xff0c;特别是Seq2Seq架构。序列到序列模型&#xff0c;顾名思义&#xff0c;它的核心任务就是将一个序列映射到另一个序列。这个序列可以是文本&#xff0c;也可以是其他符号序列。最早&#xff0c;人们尝试用一个单一的RNN来…

mac M2能安装的虚拟机和linux系统系统

能适配MAC M2芯片的虚拟机下Linux系统的搭建全是深坑&#xff0c;目前网上的资料能搜到的都是错误的&#xff0c;自己整理并分享给坑友们~ 网上搜索到的推荐安装的改造过的centos7也无法进行yum操作&#xff0c;我这边建议安装centos8 VMware Fusion下载地址&#xff1a; htt…

「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具

引言&#xff1a;从Proteus到国产平台的范式革新 在高校嵌入式实验教学中&#xff0c;仿真工具的选择直接影响学生的工程能力培养与创新思维发展。长期以来&#xff0c;Proteus作为经典工具占据主导地位&#xff0c;但其设计理念已难以满足现代复杂系统教学与国产化技术需求。…

【Linux】在Arm服务器源码编译onnxruntime-gpu的whl

服务器信息&#xff1a; aarch64架构 ubuntu20.04 nvidia T4卡 编译onnxruntime-gpu前置条件&#xff1a; 已经安装合适的cuda已经安装合适的cudnn已经安装合适的cmake 源码编译onnxruntime-gpu的步骤 1. 下载源码 git clone --recursive https://github.com/microsoft/o…

前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)

前端实现本地文件上传与预览&#xff08;PDF格式展示&#xff09;不走后端接口 实现步骤 第一步&#xff1a;文件选择 使用前端原生input上传本地文件&#xff0c;或者是el-upload组件实现文件选择功能&#xff0c;核心在于文件渲染处理。&#xff08;input只不过可以自定义样…

Python 数据分析与可视化:开启数据洞察之旅(5/10)

一、Python 数据分析与可视化简介 在当今数字化时代&#xff0c;数据就像一座蕴藏无限价值的宝藏&#xff0c;等待着我们去挖掘和探索。而 Python&#xff0c;作为数据科学领域的明星语言&#xff0c;凭借其丰富的库和强大的功能&#xff0c;成为了开启这座宝藏的关键钥匙&…

C语言学习记录——深入理解指针(4)

OK&#xff0c;这一篇主要是讲我学习的3种指针类型。 正文开始&#xff1a; 一.字符指针 所谓字符指针&#xff0c;顾名思义就是指向字符的指针。一般写作 " char* " 直接来说说它的使用方法吧&#xff1a; &#xff08;1&#xff09;一般使用情况&#xff1a; i…

springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

一句话本质 为每个线程创建独立的变量副本&#xff0c;实现多线程环境下数据的安全隔离&#xff08;线程操作自己的副本&#xff0c;互不影响&#xff09;。 关键解读&#xff1a; 核心机制 • 同一个 ThreadLocal 对象&#xff08;如示意图中的红色区域 tl&#xff09;被多个线…

Nacos源码—8.Nacos升级gRPC分析六

大纲 7.服务端对服务实例进行健康检查 8.服务下线如何注销注册表和客户端等信息 9.事件驱动架构源码分析 一.处理ClientChangedEvent事件 也就是同步数据到集群节点&#xff1a; public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…