字符串--字符串字面量、字符串的存储

news2024/10/5 21:24:13

一、字符串字面量(string literal)
字符串字面量(string literal ),有时也成为字符串常量,它是由一对双引号括起来的一个字符序列。如“hello”,“123”等都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串字面量。

注意,字符串字面量不同于字符常量。
例如,“a”是字符产字面量,而‘a’是字符常量。

为了便于确定字符串的长度,C编译器会自动在字符串的末尾添加一个ASCII码值为0的空操作符’\0’ 作为字符串结束的标志,在字符串中可以不显示的写出。因此,字符串(string)实际上是由若干个有效字符构成且以字符’\0’作为结束的一个字符序列。

二、字符串的存储
C语言没有提供字符串类型的数据,因此字符串的存取要用字符型数组来实现。一个字符串可以存于字符数组中,但一个字符型数组中存储的并非一定是一个字符串,这要看它的最后一个元素是否为’\0’ ,字符数组是由字符构成的数组,仅当其最后一个元素为’\0’ 时才表示字符串。字符串结束标志’\0’ 也占一个字节的内存,但它不计入字符串的实际长度,之计入数组的长度。
对字符数组,可以采用和其他数组一样的方式进行初始化。
例如:
char str[6]={‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};
定义了一个有6个元素的字符数组str,其前5个元素分别初始化为’H’,‘e’,‘l’,‘l’,‘o’,最后一个元素初始化为’\0’。
注意,如果没有’\0’,那么数组str就不代表一个字符串。因为’\0’在内存中也占一个字节的存储单元,所以数组定义的长度应大于等于字符串中包括’\0’在内的字符个数。字符数组str初始化后,其存储结构如图所示:
字符数组str的存储结构如果省略对数组长度的声明,例如:
char str[ ]={‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};
那么系统会自动按照初始化列表中提供的初值个数确定数组的大小。

char str [ ] = {‘H’,‘e’,‘l’,‘l’,‘o’};
系统将str初始化为一个长度为5的数组,因为存储字符串“Hello”至少需要6个字节的存储单元,长度声明为5时,将会因为没有多余的空间存放编译系统在数组末尾自动添加的’\0’ ,而使系统无法将str当作字符串来处理。所以,当省略对数组长度的声明时,必须人为地在数组地初始化列表中添加’\0’ ,才能将其作为字符串来使用。
还可以采用如下更简单地方法初始化字符数组,即用字符串常量初始化字符数组。例如:
char str[ ] = {“Hello”};
也可省略花括号,直接写成:
char str [ ] = “Hello”;
按这种方式定义和初始化数组,不必指定数组地大小,也不必单独为数组中地每个元素进行初始化,编译系统会根据字符串中字符地个数来确定数组地大小,由于字符串字符量“Hello”地末尾字符是’\0’ ,因此数组的大小为字符串中实际字符地个数加1。
无论采用哪一种方式初始化数组,都要留有足够地存储空间以便存储字符串地结束标志。因此,字符数组地大小一定要比字符串中实际地字符数多1。例如本例字符串地实际长度是5,而字符数组地大小为6。

通常,将一个字符串存放在一维字符数组中,将多个字符串存放在二维字符数组中。当二维字符数组存放多个字符串时,数组第一维地长度代表要存储地字符串地个数,可以省略,但是第二维地长度不能省略,应按最长地字符串长度设定数组第二维的长度。例如:

char weekday[7][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

也可以写成:

char weekday[ ][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

但是不能写成:

char weekday[ ][]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

因为二维数组是按行存储的,系统必须知道每一行的长度才能为数组分配存储单元。
数组weekday初始化后的结果为:
在这里插入图片描述
数组weekday的第二维长度声明为10,表示每行最多存储有10个字符(含’\0’)的字符串,当初始化列表中提供的字符串长度小于10时,系统将其后剩余的单元自动初始化为’\0’。
若字符串太长,无法写在一行中,则可将其拆分为几个小的片段写在不同行,例如:
char longstring[ ]=“This is the first half of string” “and this is the second half.”;

例题:读取字符串数组长度,并打印。

#include <stdio.h>

char longstr[]="This is the first half of the string"
				"and this is the second half";

int main(void)
{
	int i;
	int n=0;
	while(longstr[n]!=0)//读取长度
	{
		n++;
	}
	printf("%d\n",n);
//	printf("%p",'\t');
	for(i=0;i<n;i++)//打印字符串数组
	{
		printf("%c\t",longstr[i]);
		if((i+1)%10==0)
			printf("\n");
	}
 } 

在这里插入图片描述

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

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

相关文章

C++入门:类和对象(上)

目录 前言&#xff1a; 一&#xff1a;初识面向过程和面向对象 二&#xff1a;类的引入 三&#xff1a;封装和类的访问限定符 (1)封装 (2)访问限定符 四&#xff1a;类的作用域和类的定义 (1)作用域 (2)类的定义 五&#xff1a;类的实例化(对象) 六&#xff1a;类对象…

代码随想录第58天

1.每日温度&#xff1a; 1.什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置&#xff0c;此时我们就要想到可以用单调栈了。 2.单调栈里元素是递增呢&#xff1f; 还是递减呢&#xff1f; 注意以…

阿里云服务器解析绑定后访问不了的变态策略

阿里云服务器默认把80端口毙掉了&#xff0c;说是为了服务器安全。 客户买个一般服务器不就是弄个网站&#xff0c;80或者443端口默认还需要自己打开。 好比买个车&#xff0c;为了安全&#xff0c;没有轮胎&#xff0c;怕客户跑起来撞人&#xff0c;买完车让客户自己安装轮胎。…

Redis常见问题、各个分布式锁优缺点-05

Redis集群为什么至少需要三个master节点&#xff0c;并且推荐节点数为奇数&#xff1f; 因为新master的选举需要大于半数的集群master节点同意才能选举成功&#xff0c;如果只有两个master节点&#xff0c;当其中一个挂了&#xff0c;是达不到选举新master的条件的。 奇数个ma…

BLIP和BLIP2

文章主要是对BLIP2 &#xff08;使用冻结图像编码器和大型语言模型的Bootstrapping语言图像预训练&#xff09;论文的阅读笔记&#xff0c;也对BLIP&#xff08;用于统一视觉语言理解和生成的Bootstrapping语言图像预训练&#xff09;算法进行了简单的介绍。 一、BLIP&#xf…

走进人工智能| Computer Vision 数字化时代的视觉启示录

前言&#xff1a; 计算机视觉是通过模仿人类视觉系统的工作原理&#xff0c;使计算机能够感知、理解和解释图像和视频的能力。 文章目录 序言背景适用领域技术支持应用领域程序员如何学总结 序言 计算机视觉是人工智能领域的一个重要分支&#xff0c;它涉及使计算机能够“看”…

nginx的开始(一)---nginx的安装

文章目录 1.nginx是什么&#xff1f;2.nginx安装2.1.安装准备&#xff1a;2.2.进行安装&#xff1a;2.2.1.apt安装&#xff08;快速&#xff09;2.2.2.源码安装 2.3.配置文件简解&#xff08;nginx.conf&#xff09; 1.nginx是什么&#xff1f; Nginx&#xff08;发音为"e…

AndroidT(13) init 进程 -- first stage init 的初始化 (二)

1.概览 第一阶段的 init 工作主要用于读取系统启动阶段需要的配置信息(例如 linux的bootconfig&#xff0c;cmdline等配置信息&#xff09;、挂载文件系统、安装 kernel 中的模块驱动&#xff0c;最后就是启动第二阶段的 init 来进行 Android 系统相关的组件。第一阶段的 init …

《微服务实战》 第三十章 分布式事务框架seata TCC模式

前言 本章节介绍分布式事务框架seata TCC模式&#xff0c;上一章节介绍seata以及集成到Springboot、微服务框架里。 1、TCC模式 一个分布式的全局事务&#xff0c;整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的&#xff0c;分支事务要满足 两阶段提交 的模型要…

如何利用ChatGPT写毕业论文

如何利用ChatGPT写毕业论文 ChatGPT是什么&#xff1f;利用ChatGPT写毕业论文的步骤1.准备数据2.训练模型3.生成论文4.检查论文 总结地址 ChatGPT是什么&#xff1f; ChatGPT是一个基于GPT-2模型的开源聊天机器人&#xff0c;它可以回答用户的问题&#xff0c;进行闲聊和提供各…

或许是一个新的算法方向?

动动发财的小手&#xff0c;点个赞吧&#xff01; 今日谷歌 DeepMind 使用深度强化学习发现更快的排序算法&#xff0c;相关论文[1]成果已经发表在Nature上。 据报道&#xff1a;该算法可以提速 70&#xff05;&#xff0c;相比之下&#xff0c;快了3倍之多。 摘要 排序或散列等…

230611-通过Doxygen实现项目代码的文档自动化生成(Mac+Win通用)

背景介绍 目前主流的Python项目的文档管理多通过Sphinx实现&#xff1b;当前Sphinx尚未有针对C#等代码的插件&#xff1b;若想对C#的项目代码进行Sphinx的管理&#xff0c;可通过Doxygen导出为xml文件&#xff0c;进行二次转换&#xff1b;有关Doxygen的介绍及使用&#xff0c…

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例

Java使用Opencv进行大图找小图并使用其找图功能进行bilibili视频下载案例 一、Opencv大图找小图说明二、Opencv的window安装1.下载windows下的安装包2.安装3.Java中Opencv加载测试 三、Java中通过Opencv进行模板匹配大图找小图四、进行多图查找五&#xff1a;案例下载bilibili视…

碳排放预测模型 | Python实现基于机器学习回归分析的碳排放预测模型——随机森林、决策树、KNN 和多层感知器 (MLP) 预测分析

文章目录 效果一览文章概述研究内容环境准备源码设计KNNRandom ForestDecision TreeMLPModel Evaluation学习总结参考资料效果一览

【Android开发基础】随机点名系统(关于读取xml资源文件)

文章目录 一、引言二、设计1、读取xml2、下拉框Spinner3、随机算法 三、实施1、子元素随机&#xff08;单位&#xff1a;班级&#xff09;2、父元素随机&#xff08;单位&#xff1a;专业&#xff09;3、指定人数随机4、指定人数混合排序 四、附件 一、引言 描述&#xff1a;这…

【手撕MyBatis源码】动态SQL全流程解析

文章目录 动态SQL概述ifchoose(when、otherwise)trim&#xff08;where、set&#xff09;foreach OGNL表达式BoundSql动态SQL主流程分析SqlNodeDynamicContext源码解析StaticTextSqlNodeTextSqlNodeIfSqlNodeChooseSqlNodeForEachSqlNode 动态脚本结构动态脚本执行 SqlSourceSt…

Spring Cloud - Eureka原理、注册、搭建、应用(全过程详解)

目录 一、Eureka 注册原理 1.1、为什么要使用 Eureka 1.2、Eureka 的工作流程及原理 1.3、eureka 的作用 二、具体实现 2.1、搭建注册中心 2.2、服务注册和部署 2.2.1、user-service 服务注册 2.2.2、服务部署 2.2.3、order-service 服务注册 2.2.4、验证服务 2.3、…

java SSM 药品集中管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 药品集中管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

[神经网络]迁移学习-微调

一、概述 一般的有监督迁移学习分为以下三种&#xff1a; ①将训练好的模型作为特征抽取模块&#xff08;例如以resnet进行特征提取&#xff09; ②在一个相关的任务中训练后直接后直接使用(例如gpt) ③在训练好的模型基础上进行微调 此外还有无监督学习的方式 zero-shot&#…

【集群】LVS+Keepalived群集

文章目录 前言一、Keepalived的概念1. Keepalived 概述2. Keepalived 作用3. Keepalived 实现原理剖析3.1 Keepalived 工作原理3.1 VRRP协议&#xff08;虚拟路由冗余协议&#xff09; 4. Keepalived 主要模块及其作用4.1 健康检查方式&#xff08;学名&#xff1a;探针&#x…