C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)
目录
一、前言
💦什么是字符串
💦字符串如何存储?
二、字符串常量和字符数组
💦字符串常量
✨什么是字符串常量?
✨字符串常量与指针
💦字符数组
✨字符数组的应用
💦字符串常量与字符数组的区别
三、字符串常用的库函数
四、共勉
一、前言
💦什么是字符串
字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 string.h 中
💦字符串如何存储?
1️⃣: 内存存储---------字符串常量
2️⃣: 数组存储---------字符数组
二、字符串常量和字符数组
💦字符串常量
✨什么是字符串常量?
C 语言虽然没有字符串类型,但是 C语言提是存在字符串这个概念的,也就是字符串常量:以 NUL('\0') 字节结尾的 0 个或多个字符组成的序列。字符串常量是不可被修改的,一般用一对双引号(" ")括起的一串字符来表示字符串常量,如:
"Hello!"、"\aWarning!\a"、"123abc\n"、""字符串常量可以为空,如""就是一个空的字符串常量,但是即使为空,还是存在一个终止符 NUL 的。(在 C 语言中,常用转义字符 \0 来表示 NUL)
⭐举例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() {// 定义一个 字符串常量 char*a = "abc";// 输出 字符串常量的 的第一个字符 printf("%c\n",*a);// 输出整个字符串常量 printf("%s\n",a);// 输出 字符串常量的长度 、 地址 printf("字符串长度%d\n字符串地址%p\n指针变量a地址%p",sizeof(a),&"abc",a);return 0; }
✨字符串常量与指针
字符串常量与指针关系密切,因为字符串常量的值,实际上表示的是存储这些字符的内存空间的地址,更准确地说是字符串常量中第 1 个字符的地址,而不是这些字符本身。因此,在 C 语言中是不能直接进行字符串赋值的(因为没有字符串类型嘛)。在 C 语言中,常通过声明一个指向 char 类型的指针并将其初始化为一个字符串常量的方式来访问一个字符串:
char *message = "Hello World!";// 上面的语句也可以拆分成下面两句 char *message; message = "Hello World!"; // 这句话看起来像是字符串复制,其实不是,只是涉及到指针操作上述语句声明了一个指向 char 类型的指针,并用字符串常量中第 1 个字符的地址对该指针进行初始化。可以通过字符指针 message 来访问字符串常量:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() {char* message = "Hello string";printf("%s\n",message);while(*message!='\0'){printf("%c ",*message++);}printf("\n");return 0; }
这段代码,使用字符指针遍历了字符串常量中的每一个字符。
💦字符数组
用于存放字符的数组称为字符数组。在 C 语言中,除了字符串常量外,其他所有字符串都必须存储于字符数组或动态分配的内存中。定义一个字符数组和定义一个普通数组一样,不同的是字符数组中存放的是字符数据而已:
char str1[] = { 'H','e','l','l','o','\0'}; // 声明并初始化一个字符数组这句话定义并初始化了一个字符数组 str1。这个数组的长度实际上为 6 ,(它并不会自动加上'\0',需要手动加上)
C 语言提供了一种更简洁的方法来对字符数组进行初始化:char str[] = "hello"; // 声明并初始化一个字符数组⚠ 注意:上面的这两种初始化是有区别的
int main() {char str[] = "hello";printf("%s\n", str);char str1[] = { 'H','e','l','l','o'};printf("%s\n", str1);return 0; }
我们来调试看一下:
修改正确的代码:
int main() {char str[] = "hello";printf("%s\n", str);printf("\n");char str1[] = { 'H','e','l','l','o','\0'};printf("%s\n", str1);return 0; }
✨字符数组的应用
这段代码可以将字符数组中的小写字母转换成大写字母后输出。
#include <stdio.h> #include <string.h>int main() {char str[] = "hello world!";int len = strlen(str);int i;for(i = 0; i < len; i++){if( str[i] <= 'z' && str[i] >= 'a'){str[i] = str[i] - 32;}}printf("%s\n",str); }
💦字符串常量与字符数组的区别
1)字符串常量是一个字符数组,但是内容和长度在初始化时就已经固定了,不可更改;可以通过一个指向字符串常量第一个元素的指针来访问该字符串常量;
2)字符数组是一个用于存放字符的数组,字符数组的值是可以更改的。(最常用)
三、字符串常用的库函数
可以看我之前写的这篇文章:
字符串常用库函数
四、共勉
以下就是我对C语言常用字符串函数的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C语言字符串的小技巧,请持续关注我哦!!!!!
相关文章:
C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)
目录 一、前言 💦什么是字符串 💦字符串如何存储? 二、字符串常量和字符数组 💦字符串常量 ✨什么是字符串常量? ✨字符串常量与指针 💦字符数组 ✨字符数组的应用 💦字符串常量与字符数组的…...
【文件包含】任意文件包含的理解
谈谈任意文件包含的理解 1.漏洞描述 攻击者可以利用任意文件包含漏洞,读取文件,执行代码,对服务器造成危害。程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此…...
【ERROR】ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND No package.json
1、报错 启动项目的时候,报这个错误,是因为根目录错误,查看,根目录是否错误。...
Gitlab CI如何实现安全获取ssh-key拉取依赖项目,打包成品
文章目录 前言配置流程注册ssh-keygit runner映射文件方法1 .gitlab-ci.yml使用方法2 docker build 实现 总结 前言 之所以写这篇文章是由于存在以下场景: 当前的项目编译需要依赖别的项目协同编译,如何将别的项目也pull到该项目里,编译成品…...
C#匿名方法介绍
在C#中,匿名方法是一种没有名称的方法,可以被用作委托的参数或者赋值给委托类型的变量。匿名方法主要有两种形式:匿名方法和lambda表达式。 匿名方法:这是C# 2.0引入的特性。匿名方法用delegate关键字定义,它可以有参…...
Linux C/C++全栈开发知识图谱(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
众所周知,在所有的编程语言中,C语言是一门颇具学习难度,需要很长学习周期的编程语言。甚至很多人经常听到一句调侃的话语——“C,从入门到放弃”。 C界的知名书籍特别多,从简单到高端书籍,许多书籍都是C之…...
pyTorch Hub 系列#2:VGG 和 ResNet
一、说明 在上一篇教程中,我们了解了 Torch Hub 背后的本质及其概念。然后,我们使用 Torch Hub 的复杂性发布了我们的模型,并通过相同的方式访问它。但是,当我们的工作要求我们利用 Torch Hub 上提供的众多全能模型之一时,会发生什么? 在本教程中,我们将学习如何利用称为…...
clip4clip:an empirical study of clip for end to end video clip retrieval
广告深度学习计算:阿里妈妈智能创意服务优化使用CPU/GPU分离的多进程架构,加速阿里妈妈智能创意服务。https://mp.weixin.qq.com/s/_pjhXrUZVzFRtiwG2LhnkwCLIP4Clip: CLIP 再下一城,利用CLIP实现视频检索 - 知乎前言: OpenAI 的论…...
rocksdb中测试工具Benchmark.sh用法(基准、性能测试)
1.首先要安装db_bench工具,这个工具在成功安装rocksdb之后就自动存在了,主要是在使用make命令之后就成功安装了,详情请见我之前的文章 2.确保成功安装db_bench之后,找到安装的rocksdb目录下面的tools文件夹,查看里面是…...
JS-项目实战-点击水果名修改特定水果库存记录
1、fruit.js function $(name) {if (name) {//假设name是 #fruit_tblif (name.startsWith("#")) {name name.substring(1); //fruit_tblreturn document.getElementById(name);} else {return document.getElementsByName(name); //返回的是NodeList类型}} }//当…...
Redis渐进式rehash小疑问
一、rehash是什么 在Redis中,Rehash是指在进行哈希表扩容或缩容时重新计算和重新分配哈希槽的过程。Redis使用哈希表来存储键值对,哈希表中的每个槽位对应一个哈希槽,每个槽位可以存储多个键值对。 当哈希表的负载因子(load facto…...
C#winform门诊医生系统+sqlserver
C#winform门诊医生系统sqlserver说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术:基于C#winform架构和sql server数据库 功能模块: 个人中心:修改个人信息、打开照片并进行修改 预约挂号:二级…...
设计模式 -- 工厂模式(Factory Pattern)
工厂模式:属于 创建型模 式,最常用的设计模式之一,提供了一种创建对象的最佳方式。 介绍 意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决…...
设计模式-08-适配器模式
经典的设计模式有23种,但是常用的设计模式一般情况下不会到一半,我们就针对一些常用的设计模式进行一些详细的讲解和分析,方便大家更加容易理解和使用设计模式。 1-适配器模式原理 适配器模式的英文翻译是Adapter Design Pattern。顾名思义&…...
北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374
北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 reg_74LS374.v 1.2 reg_LS3…...
【Android】带下划线的TextView
序言 我们有时候需要一个类似这样的显示,上面是文字,下面是一条线 这样的显示效果是TextView实现不了的,需要我们自己进行修改一下。 实现 创建一个UnderlineTextView,继承系统的TextView class UnderlineTextView(mContext…...
图解未来:数据可视化引领智慧决策时代
图表和数据可视化在数据分析中的关键作用 引言: 在现代数据科学中,数据可视化扮演着至关重要的角色。通过图表和可视化工具,我们能够更直观、更有效地理解数据的分布、趋势和关联性。本文将深入讨论三个主要的数据可视化工具:mat…...
例解什么是Python装饰器
Python中的装饰器一直是一个比较难理解的概念,我自己理解的就是用一个函数去修改另一个函数,主要是为另一个函数添加计时等功能,而且不用改变另一个函数,这样就大大减少了另一个函数的维护成本。 这个装饰器,英文名就…...
EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息
0 工具准备 1.EtherCAT从站EEPROM数据(本文使用DE3E-556步进电机驱动器)1 字10-63邮箱、EEPROM信息 1.1 字10-63组成规范 字10-63虽然包含的空间区域很大,但实际上仅包含引导状态下邮箱配置、标准邮箱配置、EEPROM大小、执行的SII标准版本…...
【文件读取/包含】任意文件读取漏洞 afr_1
1.1漏洞描述 漏洞名称任意文件读取漏洞 afr_1漏洞类型文件读取漏洞等级⭐漏洞环境docker攻击方式 1.2漏洞等级 高危 1.3影响版本 暂无 1.4漏洞复现 1.4.1.基础环境 靶场docker工具BurpSuite 1.4.2.靶场搭建 1.创建docker-compose.yml文件 version: 3.2 services: web: …...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...






