【C语言】字符与字符串---从入门到入土级详解

🦄个人主页:修修修也

🎏所属专栏:C语言

⚙️操作环境:Visual Studio 2022


目录

一.字符类型和字符数组(串)简介

1.ASCII

2.定义,初始化,使用

1>字符的定义及初始化

2>字符串的定义及初始化

二.字符

1.字符的输入与输出

2.常见字符操作函数

   1>字符大小写转换

   2>字符类型判断

三.字符串

1.字符串的输入与输出

2.常见字符串操作函数

1>字符串拷贝

2>字符串长度

3>字符串比较

4>字符串连接与分割

5>字符串搜索与定位


一.字符类型和字符数组(串)简介

1.ASCII

🌱先来看看百度百科对ASCII的定义d3df34cb0b4a4d76bd40712577624c44.png

🌱而ASCII的产生原因是:      

        在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

🌱ASCII的内容:ec32c720fb3144b0bc80c82dbcfcc9a5.png


2.定义,初始化,使用

1>字符的定义及初始化

        因为计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。我们最常用的编码就是ASCII编码。我们先定义一个名叫ch的字符变量,再给它赋值为’A‘,如:

char ch;
ch='A';

         在C语言中,用单引号括起来的单个字符被称为字符常量。编译器一发现’A‘,就会将其转换成相应的代码值。因此字符数据的初始化中,单引号必不可少。

        实际上,字符是以数值形式储存的,所以也可以使用数字代码值来赋值,如:

char ch=65;

        因为虽然65是int类型,但是它在char类型能表示的范围内,所以将其赋值给ch没问题。


2>字符串的定义及初始化

        字符串是一个或多个字符的序列,如下所示:

"Hello world"

        注意,双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。

char arr[15]="Hello world";

        实际如上字符串在内存中的存储方式是:

112e0936e7e449f0a540620019cb6ea1.png

        该字符数组的末尾位置的字符\0是空字符,C语言用它标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值是(或等价于)0。C中的字符串一定以空字符结束,这意味着数组的容量必须至少比待存储字符串中的字符数多1。否则如果因为容量不够漏存了\0,将会导致系统出现一些bug。如下bug就是因为数组长度不够存储\0导致的:

f48fcf8c6bbf4c32b9c35b3fba801170.png

        因为C语言大多数的库函数在处理字符串时都会默认将\0作为字符串的结尾,如我们后面会提到的:strlen()函数(字符串长度计算函数),strcpy()函数(字符串拷贝函数)等大多都是以识别出\0来作为程序的结束标志,因此对于字符串来说,\0的存在至关重要。但是我们在定义和初始化字符串时,却不用特意在字符串的末尾安放\0,因为当字符数组容量允许时,计算机会默认帮助我们在末尾添上\0的。而在这点上字符串常量也是同理,如:

b9c1cb7e7a9a46ce85e2bb156888ee3f.png

         可以看到,打印的结果没有出现之前的bug现象,因此即便是字符常量,计算机也会默认帮助我们在结尾添上\0。


二.字符

1.字符的输入与输出

字符的输入常用:scanf()函数

getchar()函数2a6e76ca025a4bca90bf7be8930e5979.png

字符的输出常用:printf()函数

putchar()函数b3ecac927b544339a19b16bc411f9e1c.png


2.常见字符操作函数

   1>字符大小写转换

        方法一:使用 `toupper` 和 `tolower` 函数,这两个函数分别将字符转换为大写和小写形式。

        方法二:使用字母的ASCII码值特性,给大写字母+32转换成小写字母,给小写字母-32转换成大写字母。

        方法三:使用位运算,将字符的 ASCII 码与 32(二进制为 0b00100000)进行按位异或运算,即可将小写字母转换为大写字母,反之亦然。例如,`'a' ^ 32` 的结果为 `'A'`,`'A' ^ 32` 的结果为 `'a'`。如:cc90aa3c7fd04316bd0a51f38d5770ea.png

        有关大小写字母的三种转换方式有感兴趣的朋友可以移步我的这篇博客:【C语言】字母转换大小写的三种方法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/130932158?spm=1001.2014.3001.5502

        里面有非常详细的toupper()函数和tolower()函数的参数解读及使用详解同时还包含方法二和方法三的具体实现步骤。因此这篇博客中对该部分内容就不赘述了。


2>字符类型判断

方法一:库函数判断

字符类型判断相关库函数

序号函数名函数作用
1        isdigit()判断字符是否为数字
2isalpha()判断字符是否为字母
3isalnum()判断字符是否为数字或字母
4isspace()判断字符是否为空格字符
5isupper()和 islower()分别用于判断字符是否为大写字母和小写字母
6iscntrl()判断字符是否为控制字符
7isprint()判断字符是否为可打印字符
8ispunct()判断字符是否为标点符号

方法二:使用ASCII数值区间或字符区间判断,如:

char ch='c';
int letter=0;
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))letter++;

上述代码就是使用字符区间来判断的例子。

方法三:当然我们也可以直接使用ASCII码值来进行判断,如:

char ch='s';
int letter=0;
if((ch>=65&&ch<=90)||(ch>=97&&ch<=122))letter++;

        有关字符类型的三种判断方式有感兴趣的朋友可以移步我的这篇博客:

【C语言】字符类型判断的三种方式icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/130956167?spm=1001.2014.3001.5501

        里面有非常详细的C语言字符判断库函数详解及其使用,同时还包含方法二和方法三的具体实现步骤。因此这篇博客中对该部分内容就不赘述了,有兴趣的可以去看看。


三.字符串

1.字符串的输入与输出

字符串的输入常用scanf()函数,gets()函数,fgets()函数:76b349d4148c40c78ad4a951643a4fbf.png

字符串的输出常用printf()函数,puts()函数,fputs()函数:0e8d1bf975564c399ddbfa6a3bcf7607.png


2.常见字符串操作函数

1>字符串拷贝

strcpy()函数

函数详解见文末文章

strncpy()函数


2>字符串长度

strlen()函数

函数详解见文末文章


3>字符串比较

strcmp()函数

strncmp()函数


4>字符串连接与分割

字符串连接:

strcat()函数

strncat()函数

字符串分割:

strtok()函数


5>字符串搜索与定位

strchr()函数

strrchr()函数

strstr()函数



结语

希望这篇关于字符与字符串的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【C语言】strlen()函数

【C语言】strcpy()函数


C语言字符串库函数思维导图:

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

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

相关文章

Linux 网络虚拟化 Macvlan(基于物理网络接口虚拟网络接口) 认知

写在前面 博文内容涉及 Macvlan 的简单认知&#xff0c;以及一个Demo博文内容根据《 Kubernetes 网络权威指南&#xff1a;基础、原理与实践》 整理理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前…

flink1.18.0 自定义函数 接收row类型的参数

比如sql中某字段类型 array<row<f1 string,f2 string,f3 string,f4 bigint>> 现在需要编写 tableFunction 需要接受的参数如上 解决方案 用户定义函数|阿帕奇弗林克 --- User-defined Functions | Apache Flink

传输层/UDP/TCP协议

再谈端口号 TCP/IP协议用“源IP”&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”&#xff0c;“协议号”&#xff0c;这样一个五元组来标识一个通信&#xff08;可以用netstat -n来查看&#xff09;。 端口号的划分和知名端口号 我们之前就说过&am…

Linux信号量(简易版)

Sem.hpp(用于封装信号量): #include<iostream> #include<queue> #include<unistd.h> #include <semaphore.h> using namespace std; class Sem { public:Sem(int num){sem_init(&_sem,0,num);}~Sem(){sem_destroy(&_sem);}void V(){sem_post(…

Jenkins通知目标服务器拉取Harbor镜像部署

1.告诉目标服务器拉取哪个镜像 2.判断当前有没有正在运行此容器&#xff0c;有就删除 3.接着查看拉取的镜像目标服务器上是否已存在&#xff0c;有就删除 4.拉取Harbor镜像 5.运行容器 目标服务器编写脚本 创建个部署脚本 vim deploy.sh告诉目标服务器Harbor地址、仓库、镜像…

前端小白的学习之路(HTML5 一)

提示&#xff1a;一些HTML5新增的标签:语义化标签&#xff0c;<img>,<video>,<audio> 目录 一、HTML5简介 二、语义化标签 1)新增语义化标签 2)示例 三、多媒体标签 1)图片标签 图片加载问题 1.当图片路径预设好时可以直接获取图片的信息 2.当在JS中…

【SQL】1193. 每月交易 I 【年月日(日期)拼接相关函数】

前述 知识点学习&#xff1a; SQL 日期函数 day() 、month()、year() 各种使用方法mysql 两个字符年月拼接 题目描述 leetcode题目&#xff1a;1193. 每月交易 I 思路 先按照年月排&#xff0c;再按照country排列 日期拼接相关的函数 year(): 截取年份&#xff1b;month…

Java设计模式 | 设计模式概述和分类

独孤求败五重境界 利剑&#xff08;“凌厉刚猛&#xff0c;无坚不摧&#xff0c;弱冠前以之与河朔群雄争锋。”&#xff09;软剑&#xff08;“紫薇软剑&#xff0c;三十岁前所用&#xff0c;误伤义士不祥&#xff0c;乃弃之深谷。”&#xff09;重剑&#xff08;“重剑无锋&a…

宜搭faas服务器获取accessToken

可以用faas服务器的OpenAPIUtil.getCustomAccessTokenThenCache&#xff08;Client ID,Client Secret&#xff09;就可以获取 至于获取这个Client ID&#xff0c;Client Secret 就需要在钉钉开放平台创建一个应用 然后在这个应用的基础信息里面有 注意的是&#xff1a;如果需要…

「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架

文章目录 关于 | About技术文档 | Document开源项目 | Project 案例 | Demo项目结构 | Structure主程序配置集成 | Settings引入框架依赖 | Framework在配置文件加入配置 | YamlSpringBoot启动类改引导类 | Change 插件配置集成 | Settings引入依赖 | XML定义插件引导类 | Clas…

Java并发编程—JUC线程池架构

Java并发编程&#xff08;JUC&#xff0c;Java Utilities Concurrency&#xff09;中的线程池架构是Java提供的一种用于管理和复用线程的机制。线程池的主要目标是减少线程创建和销毁的开销&#xff0c;提高系统的响应速度&#xff0c;并通过合理的线程管理和资源分配&#xff…

JUnit 面试题及答案整理,最新面试题

JUnit中的断言&#xff08;Assert&#xff09;有哪些类型&#xff1f; JUnit提供了多种断言类型来帮助测试代码的正确性。常见的断言类型包括&#xff1a; 1、assertEquals&#xff1a; 用于检查两个值是否相等。如果不相等&#xff0c;测试失败。 2、assertTrue和assertFal…

数据结构的概念大合集05(串)

概念大合集05 1、串的相关定义2、串的基本运算3、串的顺序存储结构3.1 顺序串 4、串的链式存储结构4.1 链串 1、串的相关定义 串是有零个户多个字符组成的有限序列&#xff0c;比如字符串。用 “ ” 或 ‘ ’ 来表示串。两个串相等&#xff1a;当且仅当这两个串的长度相等并且…

sqllab第二十五A关通关笔记

知识点&#xff1a; 数值型注入双写绕过 oorranand这里不能用错误注入&#xff08;固定错误回显信息&#xff09;联合注入 测试发现跟25关好像一样&#xff0c;就是过滤了and or # 等东西 构造payload:id1/0 发现成功运算了&#xff0c;这是一个数值型的注入 构造payload:id…

高效使用 JMeter 生成随机数:探索 Random 和 UUID 算法

在压力测试中&#xff0c;经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值&#xff0c;本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数&#xff0c;其中最常用的是__Random函数。该函数可以生成一个指定范围内的随机整数或浮…

薄膜电容的工作原理,结构特点,工艺流程,选型参数及设计注意事项总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点4,工艺流程4.1,材料准备4.2,介质薄膜处理4.3,电极制作4.4,卷绕或堆叠4.5,焊接与引出线制作4.6,封装与保护4.7,测试与筛选4.8,老化与稳定性测试4.9,最终测试与标记

瑞_Redis_短信登录(二)

文章目录 项目介绍1.1 项目准备1.2 基于Session实现登录流程1.2.1 发送短信验证码1.2.2 短信验证码登录、注册1.2.3 校验登录状态 1.3 实现发送短信验证码功能1.3.1 页面流程1.3.2 代码实现 1.41.51.6 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的…

Android init.rc 解析

init.rc 文件是 Android 系统中非常重要的一部分&#xff0c;它定义了系统在启动过程中的行为和服务的初始化顺序。在 RK3566 Android 11 的环境中&#xff0c;init.rc 文件的结构和语法与其他 Android 版本大致相同。下面我将逐句解释 init.rc 文件中的典型内容&#xff1a; …

lua脚本的基础内容

官方地址&#xff1a;http://luajit.org/ 官方wiki地址&#xff1a;http://wiki.luajit.org/Home 推荐书籍&#xff1a; OpenResty 最佳实践&#xff1a;https://moonbingbing.gitbooks.io/openresty-best-practices/content/ lua基础文档&#xff1a;https://www.runoob.com/l…

深入理解生成型大型语言模型:自监督预训练、细调与对齐过程及其应用

分析概述 本文主要介绍了生成型大型语言模型&#xff08;LLM&#xff09;的预训练过程&#xff0c;特别是通过下一个令牌&#xff08;token&#xff09;预测的自监督学习方法&#xff0c;以及后续的细调&#xff08;finetuning&#xff09;和对齐&#xff08;alignment&#x…