C语言王国探险记之字符串+注释

news2024/11/17 11:28:38

王国探险记系列

文章目录(3)


前言

一,什么是字符串呢?

1,那C语言是怎么表示字符串的呢?

"hello world.\n"

2,证明字符串的结束标志是一个 \0 的转义字符

3,证明字符串的结束标志\0 的重要性

3.1我们在arr2的字符串数组后面加一个\0然后看结果

四,我们还可以通过计算字符串长度来证明字符串后面有一个隐藏的\0

提前知道:

五,注释

总结


前言

C语言王国探险记,是我们学习C语言,从小白成长为大佬的的探险历程,我们在这章将探险字符串和注释这个知识关卡


一,有字符串类型吗?

c语言中字符类型,但是有字符串类型吗?

char

short

int 

long 

long long 

folat

double

我们在怎么类型里面有没有见到一个叫字符串类型的呢?没有

C语言有字符类型,但是没有字符串类型。

1,那C语言是怎么表示字符串的呢?

"hello world.\n"

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。

注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。

2,证明字符串的结束标志是一个 \0 的转义字符

简单写一个代码让大家跟着我们看一下

我们主函数写出来就什么都不写

我们将在代码加注释和结果运行图中进行知识点的讲解:


//如何证明\0是字符串的结束标志呢
int main()
{

	return 0;
}
//调试技巧:先按F10,开始调试之后,出现箭头开始调试了
//在菜单栏里点调试,然后是监视窗口的,分为1,2,3,4
//点那个监视窗口都可以
//这里给上一个双引号然后加上abcdef。好像平平无奇
//然后我们点开可以看到abcdefg后面跟了一个\0
//实际上当你看到这个字符串的时候可以看到字符串有个\0吗,看不到
//只有当你真正的去观察会发现,g后面还放了一个\0的字符
//其实在字符串的末尾是隐藏了一个\0的字符的,当你写出这样一个字符串的时候悄悄的隐藏了一个\0
//这个\0叫做字符串的结束标准
//一个字符串当真正往后走,遇到\0的时候,它才认为这个字符串结束了
//\0是字符串的结束标志

注意:

我们的main()函数里面是没有任何的值的,我们的第三张图里面的“abcdef"字符串是我们在监控窗口里面添加的

看图:我们可以看到一套流程后,我们可以看到,在字符串的最后有一个隐藏的\0。

3,证明字符串的结束标志\0 的重要性

 我们现在再举一个有打印字符数组来证明\0对字符串有很重要的意义的代码实例:

//字符串是可以存放在字符数组中的
//%s是打印字符串
int main()
{
	char arr1[] = "abc";
	//我们这个地方看到的是这样一个现象,隐藏了一个\0
	char arr2[] = { 'a' , 'b' , 'c'};//我们说C语言里面两个单引号引起来的是一个字符,
    //中间是一个逗号
	//我们可以看到后面没有\0
	//现在开始打印字符串
	//pfintf()怎么来打印字符串呢很简单
	//一个"%s"就可以打印
	printf("%s\n", arr1);//就是把arr1这个里面的字符串数组打印出来,打印完换个行
	printf("%s\n", arr2);//就是把arr2这个里面的字符串数组打印出来,打印完换个行
	//这就是我们现在的打印两个字符串
	//看一下我们的效果
	return 0;
}
//调试调监控,发现确实后面隐藏了\0
//证明了字符串里面放了一个隐藏的\0
//这个\0是字符串的结束标志,她对于字符串来说非常重要

我们通过代码+注释和结果运行图来理解:

结果分析: 

我们可以看到arr1有\0作为结束标志,arr2数组是没有\0作为结束标志,我们在通过运行结果图可以看到

arr1打印完abc就停下来了

arr2打印完abc就是烫烫烫烫.....

在里面最大的问题就在于\0,我们前面说了\0是字符串的结束标志

我们还可以通过字符数组在内存中的表示形式来理解\0的重要性:

arr1的内存布局

a b c \0

因为有\0所以就只打印到c就停止了,就证明了\0的重要性

arr2的内存布局

a b c 

后面是啥不知道,我只知道我在数组里面放了abc,后面是不是\0不知道所以当%s打印arr2的时候,字符串打印一定是遇到\0停止,当c打印完之后要不要打印呢,取决于后面有没有\0,我们这个结果可见没有遇到\0,直达在某一个一个地方遇到\0了,恰好又是他随机碰上的一个\0才停止打印。这就证明了\0的重要性

3.1我们在arr2的字符串数组后面加一个\0然后看结果

我们通过代码+注释和结果运行图来理解:

int main()
{
	char arr1[] = "abc";
	//我们这个地方看到的是这样一个现象,隐藏了一个\0
	char arr2[] = { 'a' , 'b' , 'c' ,'\0'};
	//如果这里主动放一个\0呢,我们打印看一下
	// 这个时候就是两个abc了
	//我们说C语言里面两个单引号引起来的是一个字符,中间是一个逗号
	//我们可以看到后面没有\0
	//现在开始打印字符串
	//pfintf()怎么来打印字符串呢很简单
	//一个"%s"就可以打印
	printf("%s\n", arr1);//就是把arr1这个里面的字符串数组打印出来,打印完换个行
	printf("%s\n", arr2);//就是把arr2这个里面的字符串数组打印出来,打印完换个行
	//这就是我们现在的打印两个字符串
	//看一下我们的效果
	return 0;
}

 我们可以看到运行结果图,在arr2后加一个\0就可以被编译器正常的识别结束

再一次证明了\0的重要性

四,我们还可以通过计算字符串长度来证明字符串后面有一个隐藏的\0

提前知道:

我们计算字符串长度用到一个函数叫strlen()
str就是字符串的意思,len就是计算的意思
strlen()是一个库函数 -- 求字符串长度的,统计的是字符串中\0之前的字符个数
#include <string.h>//是strlen()这个函数所需要的头文件,string就是字符串的意思,
注意你使用字符串系列的的函数都需要引用这个头文件

我们通过代码+注释和结果运行图来理解:

//我们计算字符串长度用到一个函数叫strlen()
//str就是字符串的意思,len就是计算的意思
//strlen()是一个库函数 -- 求字符串长度的,统计的是字符串中\0之前的字符个数
//#include <string.h>//是strlen()这个函数所需要的头文件,string就是字符串的意思,
//注意你使用字符串系列的的函数都需要引用这个头文件
int main()
{
	char arr1[] = "abc";//我们统计arr1的时候我们统计到c就停止了,
	//因为遇到了\0,所以统计出来是3
	char arr2[] = { 'a','b','c' };
	printf("%d\n",strlen(arr1));//长度肯定是整数嘛,我们用%d来打印
	//strlen在数arr1的时候应该是3
	printf("%d\n", strlen(arr2));//求长度的时候也是遇到\0才停止,所以是一个随机的值
	//在计算字符串长度的时候\0是结束标志,不算作字符串内容。是统计个数的时候不统计在内的
	//但是对于arr2来说统计玩c,后面还要统计多少个字符才能遇到\0都是未可知的
	//所以strlen统计的arr2是多少是不知道的,就可能是一个随机值
	return 0;
}

 解释:

arr1和arr2的区别呢?
他们里面就差一个\0
像arr2这种没有\0的字符串是不能使用%s来打印的
但是你想要使用%c一个一个字符的去打印也是没有问题的
上面这些就是为了告诉我们字符串是上面,已经字符串中的\0是干什么的,
她是作为字符串的结束标志而存在的
这个结束标志是在统计长度的时候,和打印的时候遇到\0就停止了

五,注释

1,代码中不需要的代码可以直接删除,也可以注释掉
 我们就会将写注释方便我们去理解,当我们遇到不想删除的代码我们就可以注释掉,
 让其不在发挥作用
2.代码中有一些代码比较难懂,可以加一下注释文字
我们在上面写的代码当中,为了让我们更好的去理解代码,
写注释就是一个解释这个东西到底是啥,有啥用,帮助我们理解代码,帮助别人阅读代码的

int main()
{	
	/*这种注释方式是C语言自带的,可以一次注释多行,
	但是这种注释方式是不能嵌套注释的,如果它里面已经有了/**/就会不能完全注释掉*/
	//这是c++的注释方式
	int a = 10;//创建一个整型变量,并赋值为10
	return 0;
}

c语言风格的注释/*xxxxxxx*/

        缺陷:不能嵌套注释
c++语言风格的注释//xxxxxxxx
        可以注释一行也可以注释多行,能嵌套注释


总结

以上就是今天要讲的内容,本文仅仅简单介绍了字符串的基本概念及和注释,可以让你在c语言王国的探险更加有趣,充实。

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

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

相关文章

云原生之深入解析Flink on k8s的运行模式与实战操作

一、概述 Flink 核心是一个流式的数据流执行引擎&#xff0c;并且能够基于同一个 Flink 运行时&#xff0c;提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布&#xff0c;数据通信及容错机制等功能。Flink 官网不同版本的文档flink on k8s 官方文…

linux-2.6.22.6内核网卡驱动框架分析

网络协议分为很多层&#xff0c;而驱动这层对应于实际的物理网卡部分&#xff0c;这也是最底层的部分&#xff0c;以cs89x0.c这个驱动程序为例来分析下网卡驱动程序框架。 正常开发一个驱动程序时&#xff0c;一般都遵循以下几个步骤&#xff1a; 1.分配某个结构体 2.设置该结…

IDEA将java项目打包为jar包

方法 首先在src -> resources目录下建立一个文件夹&#xff0c;然后再在新建文件夹里面建立META-INF文件夹&#xff08;不推荐直接建立META-INF&#xff0c;否则后面打包完的jar包需要手动修改配置&#xff09; 然后点击File -> Project Structure -> Artifacts -&g…

第三章:Faster R-CNN网络详解(《Faster R-CNN: 基于区域提议网络的实时目标检测》)

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:YOLO v1网络详解 第五章:YOLO v2网络详解 第六章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正文分析 1.引入库2.读…

Mysql的逻辑架构_读写锁_事物

概览 一. MySql的逻辑架构1. 逻辑架构图2. 连接管理与安全性 二. 并发控制1. 读写锁2. 锁粒度 三. 事务1. 特性2. 隔离级别3. 死锁4. 事物日志&#xff1f;5.MySql中的事物 mysql最与众不同的特性&#xff1a;存储引擎架构 架构的设计&#xff1a; 将查询处理(Query Processin…

7、注解与自定义注解

1 注解 注解很厉害&#xff0c;它可以增强我们的java代码&#xff0c;同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。 传统我们通过xml文本文件声明方式(如下图,但是XML比较繁琐且不易检查)&#xff0c;而现在最主流的开发都是基于注解方式&#xff0c…

房贷计算器——新增选择还款方式

房贷计算器——新增选择还款方式 #!/usr/bin/env python # coding: utf-8# In[4]: 文字‘房贷计算器’ 文字‘贷款总金额’&#xff1a;输入框 文字‘贷款期限’&#xff1a;输入框 文字‘年利率’&#xff1a;输入框 按钮‘开始计算’ 返回&#xff1a; 月供 总利息 from tki…

【Framework】bindService启动流程

前言 在【Service启动流程之startService】 中&#xff0c;我们已经分析了startService的流程&#xff0c;这篇就继续讲bindService的流程&#xff0c;他们两有很多相似之处。同样&#xff0c;流程图在总结处。 我们在调用bindService方法时候&#xff0c;实际调用的是Contex…

台庆|三联开关怎么接线?

三联开关是一种常见的开关类型&#xff0c;通常用于控制一个电路中的三个不同的电器或灯具。它的用途非常广泛&#xff0c;因此了解如何正确接线是非常重要的。在本文中&#xff0c;我们将详细讨论三联开关的接线方法。 我们先来看看三联开关实物图与线路图&#xff1a; 接下来…

【音视频处理】FFmpeg详解,命令行、源码、编译安装

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论FFmpeg。 这里先提一个问题&#xff0c;FFmpeg命令行功能如此强大&#xff0c;为什么还需要舍近求远地调用库函数呢 &#xff1f; 我们按这样的顺序讨论 &#xff1a; 1、 FFmpeg命令行说明 2、 FFmpeg代码结构…

如何在 JavaScript 中压缩字符串

在 JavaScript 中&#xff0c;可以有范围很广的压缩&#xff0c;比如 gzip 之类的文件压缩等等。 在这里&#xff0c;我们将讨论两种压缩字符串的方法。 最初&#xff0c;我们将重点介绍霍夫曼算法。 稍后&#xff0c;我们将介绍解决任务的 LZString 方法。 在 JavaScript 中使…

主成分分析系列(一)概览及数据为何要中心化

一、概览 主成分分析&#xff08;Principle Component Analysis&#xff0c;PCA&#xff09;算法属于数据降维算法里面的一种。数据降维算法的主要想法是从高维度数据中找到一种结构&#xff0c;这种结构蕴含了数据中的大部分信息&#xff0c;从而将高维数据降维到低维数据&am…

Apikit 自学日记:参数构造器

构造器是测试时系统提供的快速生成请求数据的工具。一般用于快速对数据进行加密和生成随机数值。可在请求参数中某个字段的右侧选择构造器操作&#xff0c;通过构造器生成该字段的参数值。构造器由两种类型的操作组成&#xff1a;设置初始数据和多重操作。 设置初始数据 其中初…

基于C语言的开源csv解析库:MiniCSV使用示例

文章目录 MiniCSV简介官方示例csv文件解析示例CodeBlocks工程下载 MiniCSV简介 之前写了一篇基于C语言字符串操作函数的csv文件解析&#xff1a;C语言解析csv格式文件&#xff0c;本文介绍一个开源简洁的csv解析库的使用&#xff1a;MiniCSV&#xff0c;使用标准C语言设计。 …

Spring Boot 中的 Redis 的数据操作配置和使用

Spring Boot 中的 Redis 的数据操作配置和使用 Redis 是一种高性能的 NoSQL 数据库&#xff0c;它支持多种数据结构&#xff0c;包括字符串、哈希、列表、集合和有序集合。Redis 还提供了丰富的命令&#xff0c;可以对数据进行快速的 CRUD 操作。Spring Boot 是一个基于 Sprin…

数据结构--栈的引用--前中后缀表达式(前部分)

数据结构–栈的引用–前中后缀表达式(前部分) 常见的算数表达式 由三个部分组成: 操作数、运算符、界限符 \color{red}操作数、运算符、界限符 操作数、运算符、界限符 ps:界限符是必不可少的,反映了计算的先后顺序 波兰表达式(让计算机更容易识别的算数表达式) Reverse Po…

高性能分布式缓存Redis(一) 快速实战

一、缓存发展史&缓存分类 1.1、大型网站中缓存的使用 访问量越大&#xff0c;响应力越差&#xff0c;用户体验越差。 引入缓存、示意图如下&#xff1a; 读写策略&#xff1a; Cache Aside Pattern&#xff08;旁路缓存模式&#xff09;Read/Write Through Pattern&am…

AA-TransUNet github: 用于预测任务的注意力增强的TransUNet

文章目录 来源AA_TransUNet架构数据集和预训练模型使用作者 来源 github地址 AA_TransUNet架构 数据集和预训练模型 如果你对本文中使用的数据集&#xff08;降水图和云量数据集&#xff09;感兴趣&#xff0c;请访问SmaAt-UNet了解更多细节。 对于预训练的AA_TransUNet模型…

从磁盘看 IO

计算机上的易失和非易失存储器 常见磁盘可以分为两类&#xff1a;机械磁盘和固态磁盘。 第一类&#xff0c;机械磁盘&#xff0c;也称为硬盘驱动器&#xff08;Hard Disk Driver&#xff09;&#xff0c;通常缩写为 HDD。机械磁 盘主要由盘片和读写磁头组成&#xff0c;数据就…

认识固态继电器及其工作原理

什么是固态继电器&#xff0c;有什么优缺点&#xff1f; 固态继电器 简称SSR&#xff0c;又被称之为“无触点开关”它利用电子元件&#xff08;如双向可控硅等半导体器件&#xff09;的开关特性&#xff0c;可到达无触点无火花地接通和断开电路。 固态继电器工作可靠&#…