从零开始,探索C语言中的字符串

news2024/11/20 20:21:27

字符串

    • 1. 前言
    • 2. 预备知识
      • 2.1 字符
      • 2.2 字符数组
    • 3. 什么是字符串
    • 4. '\0'
      • 4.1 '\0'是什么
      • 4.2 '\0'的作用
        • 4.2.1 打印字符串
        • 4.2.2 求字符串长度

在这里插入图片描述

1. 前言

大家好,我是努力学习游泳的鱼。你已经学会了如何使用变量和常量,也知道了字符的概念。但是你可能还不了解由字符构成的字符串,这篇文章将带你一探究竟。

2. 预备知识

2.1 字符

单引号引起来的一个字符,用来初始化char类型的变量。

'a'; // 这是一个字符
char ch = 'w'; // 用来初始化char类型的变量

2.2 字符数组

字符数组可以存储很多字符,格式是char+空格+数组名+左方括号(+数组最多存储的字符个数,如果省略就默认取初始化的字符个数)+右方括号+初始化(大括号引起来几个字符,中间用逗号隔开)

char ch[3] = { 'a', 'b', 'c' }; // 最多存3个字符,即a,b,c
char ch[] = { 'd', 'e', 'f', 'g' }; // 方括号内省略字符个数,默认为4,因为初始化了4个字符

3. 什么是字符串

用双引号引起来的一串字符叫做字符串。

"abcdefg"; // 这就是一个字符串

4. ‘\0’

4.1 '\0’是什么

字符串可以用来初始化字符数组。

char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c' };

arr1arr2有什么区别呢?
在这里插入图片描述
我们发现,arr2就是很正常的存储了a,b,c这3个字符,但是arr1在后面还跟了个'\0'
这个'\0'究竟是何方神圣?

字符串的结尾都隐藏了一个叫做'\0'的转义字符。

"abc"这个字符串其实是4个字符:'a','b','c','\0',所以说,

字符串的结束标志是'\0'

4.2 '\0’的作用

4.2.1 打印字符串

我们可以用printf配合%s打印字符串。

#include <stdio.h>

int main()
{
	printf("%s\n", "abcdef");
	
    return 0;
}

把上面的arr1arr2打印出来会是怎样的呢?

#include <stdio.h>

int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a', 'b', 'c' };

	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

输出:
abc
abc烫烫烫烫烫烫烫烫烫烫bc

我们发现,字符串arr1正常打印,但是字符数组arr2打印出来的是个啥玩意呀?
要搞清楚这一点,就要明白arr1arr2的内存布局,以及'\0'的作用。
arr1是用字符串"abc"初始化的,根据前面说的,字符串的结束标志是\0,字符串的结尾都隐藏了一个\0,arr1数组里相当于存储了'a','b','c','\0'四个字符。
arr2就不一样了,它只是单纯的用三个字符'a','b','c'来初始化的,里面也只存放着这三个字符,后面没有'\0',内存中后面放了什么,我们无从知晓。
%s是用来打印字符串的,还是那句话,字符串的结束标志是'\0'
在打印arr1时,打印了'a','b','c',就遇到了'\0'这个结束标志,停止打印。
反观arr2,打印完'a','b','c',没有遇到'\0',就继续把内存中后面的值打印出来,直到遇到'\0'才停止。可是,我们不知道内存中后面放了啥,换句话说,内存中后面放的都是些随机值,那打印出来的也是随机值,具体表现出来就是abc后面的烫烫烫。
如果我们手动放一个'\0',两个字符数组的内存布局就一样了。

#include <stdio.h>

int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a', 'b', 'c', '\0' };

	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

输出:
abc
abc

4.2.2 求字符串长度

我们可以用strlen函数求字符串长度。

strlen是C语言提供的库函数,对应的头文件是string.h,使用时只需要把字符串传进去就可以了。

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a', 'b', 'c' };

	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	
	return 0;
}

输出:
3
42

有了前面的知识,就很容易理解这个结果了。
arr1里面存的是'a','b','c','\0',由于有'\0'的存在,可以很清楚的求出字符串的长度是3,也就是'\0'前面的字符的个数。
反观arr2,因为'a','b','c'后面没有'\0',所以无法求出其长度。就这次的运行结果而言,程序在内存中一直往后找呀找呀,从'a'开始一直找了42个字符才在内存中遇到了'\0',于是算出来的结果是42。这个结果是不可预料的,它是个随机值。
如果手动放一个'\0',就能够准确地求出它的长度了。

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a', 'b', 'c', '\0' };

	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	
	return 0;
}

输出:
3
3

总结:strlen求的是'\0'前面字符的个数!

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

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

相关文章

2023_Spark_实验四:SCALA基础

一、在IDEA中执行以下语句 或者用windows徽标R 输入cmd 进入命令提示符 输入scala直接进入编写界面 1、Scala的常用数据类型 注意&#xff1a;在Scala中&#xff0c;任何数据都是对象。例如&#xff1a; scala> 1 res0: Int 1scala> 1.toString res1: String 1scala…

11 模型选择 + 过拟合和欠拟合

训练集&#xff1a;用于训练权重参数 验证集&#xff1a;用来调参&#xff0c;评价模型的好坏&#xff0c;选择合适的超参数 测试集&#xff1a;只用一次&#xff0c;检验泛化性能&#xff0c;实际场景下的数据 非大数据集通常使用K-折交叉验证 K-折交叉验证 一个数据集分成…

云原生Kubernetes:二进制部署K8S多Master架构(三)

目录 一、理论 1.K8S多Master架构 2.配置master02 3.master02 节点部署 4.负载均衡部署 二、实验 1.环境 2.配置master02 3.master02 节点部署 4.负载均衡部署 三、总结 一、理论 1.K8S多Master架构 (1) 架构 2.配置master02 &#xff08;1&#xff09;环境 关闭防…

Docker:自定义镜像

&#xff08;总结自b站黑马程序员课程&#xff09; 环环相扣&#xff0c;跳过部分章节和知识点是不可取的。 一、镜像结构 镜像是分层结构&#xff0c;每一层称为一个Layer。 ①BaseImage层&#xff1a;包含基本的系统函数库、环境变量、文件系统。 ②Entrypoint&#xff1…

Vue在表格中拿到该行信息的方式(作用域插槽-#default-scope-解决按钮与行点击的顺序问题)

遇到的问题 在做表格的时候&#xff0c;表格是封装好了的&#xff0c;用于展示数据。如果想给单行增加按钮&#xff0c;可以单独写一列存放按钮&#xff0c;最基本的需求是&#xff0c;点击按钮后要拿到数据然后发起请求。 且Vue的element-plus&#xff0c;当我们点击按钮之后…

python二级例题

请编写程序&#xff0c;生成随机密码。具体要求如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬ &#xff08;1&#xff09;使用 rand…

XSS漏洞及分析

目录 1.什么是xss漏洞 1&#xff09;存储型XSS漏洞 2&#xff09;反射型XSS漏洞 3&#xff09;DOM型XSS漏洞 2.什么是domcobble破环 3.案例一 1&#xff09;例题链接 2&#xff09;代码展示 3&#xff09;例题分析 4.案例二 1&#xff09;例题链接 2&#xff09;代…

jvm-堆

1.堆的核心概念 一个jvm实例只存在一个堆内存&#xff0c;堆也是java内存管理核心区域 java堆区在jvm启动的时候即被创建&#xff0c;其空间大小就确定了&#xff0c;是jvm管理最大的一块内存空间&#xff1b; 堆可以处于物理上不连续的内存空间&#xff0c;但在逻辑上它应该被…

Linux gdb调式的原理

文章目录 一、原理分析二、dmoe测试2.1 hello.s2.2 demo演示 参考资料 一、原理分析 #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <…

使用VBA快速比对数据

实例需求&#xff1a;第一行是全系列数据集合&#xff0c;现在需要对比第一行数据&#xff0c;查找第2行数据中缺失的数字&#xff0c;保存在第3行中。 具备VBA初步使用经验的同学&#xff0c;都可以使用双重循环实现这个需求&#xff0c;这里给大家提供另一种实现思路&#x…

写的一款简易的热点词汇记录工具

项目需要对用户提交的附件、文章、搜索框内容等做热词分析。如下图&#xff1a; 公司有大数据团队。本着不麻烦别人就不麻烦别人的原则&#xff0c;写了一款简易的记录工具&#xff0c;原理也简单&#xff0c;手工在业务插入锚点&#xff0c;用分词器分好词&#xff0c;排掉字…

阿晨的运维笔记 | CentOS部署Docker

使用yum安装 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 …

使用VBA快速关闭应用程序进程

使用VBA进行开发时&#xff0c;如果需要关闭其他Office应用程序&#xff0c;那么通常可以使用GetObject的方式获取该应用程序的引用&#xff0c;然后再关闭&#xff0c;有时需要重复多次以关闭多进程。如果希望关闭的应用程序并非Office组件&#xff0c;那么GetObject方式有时就…

裸露土方智能识别算法 python

裸露土方智能识别算法通过opencvpython网络模型框架算法&#xff0c;裸露土方智能识别算法能够准确识别现场土堆的裸露情况&#xff0c;并对超过40%部分裸露的土堆进行抓拍预警。此次算法用到的Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很快就变得非常流…

NOR型flash vs NAND型flash

FLASH是一种存储芯片&#xff0c;全名叫Flash EEPROM Memory&#xff0c;通过程序可以修改数据&#xff0c;即平时所说的“闪存”。 闪存可以在软件的控制下写入和擦写数据。其存储空间被分割成相对较大的可擦除单元&#xff0c;成为擦除块&#xff08;erase block&#xff09…

嵌入式岗位笔试面试专栏 - 岗位介绍

文章目录 一、嵌入式岗位的分类二、热门领域及公司三、发展前景四、技能要求沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解嵌入岗位的工作职责 。 一、嵌入式岗位的分类 嵌入式软件工程师大致可以分为两种类型: 应用开发工程师驱动开发工程师应用工程…

【炼气境】HashMap原理以及如何使用

系列文章目录 文章目录 系列文章目录前言1、数据结构2、工作原理3、当两个对象的 hashCode 相同会发生什么&#xff1f;4、你知道 hash 的实现吗&#xff1f;为什么要这样实现&#xff1f;5、为什么要用异或运算符&#xff1f;6、HashMap 的 table 的容量如何确定&#xff1f;l…

PHP8内置函数中的变量函数-PHP8知识详解

在php8中&#xff0c;与变量相关的内置函数比较多&#xff0c;本文说一些比较重要的、常见的内置函数。今日着重讲解了5个&#xff0c;分别是&#xff1a;检测变量是否为空的函数empty()、判断变量是否定义过的函数isset()、销毁指定的变量的函数unset()、获取变量的类型的函数…

【力扣周赛】第 359 场周赛(选择区间型DP⭐⭐⭐⭐⭐新题型 双指针)

文章目录 竞赛链接Q1&#xff1a;7004. 判别首字母缩略词&#xff08;模拟&#xff09;Q2&#xff1a;6450. k-avoiding 数组的最小总和解法1——贪心哈希表解法2——数学公式 Q3&#xff1a;7006. 销售利润最大化⭐⭐⭐线性DP相似题目列表2008. 出租车的最大盈利&#xff08;和…

2023.9.1 简单认识 JVM

目录 JVM 内存划分 本地方法栈 虚拟机栈 程序计数器 堆区 元数据区 JVM 类加载机制 加载 验证 准备 解析 初始化 类被加载的几种情况&#xff08;懒汉模式 ---> 只要被用到才会被加载&#xff09; 双亲委派模型 JVM 内存划分 JVM 是一个应用程序&#xff0c;在…