C语言之字符串

目录

字符串字面量

​编辑

字符串字面量的长度

◆具有静态生命周期

◆对于同一个字符串字面量的处理方式依赖于编译器

字符串

字符数组的初始化赋值 

空字符串

字符串的读取


在前面的学习中就会发现,仅仅能用一个字符表示的事物少之又少,对于地名、人名等都需要多个字符来完成。

字符串就是字符序列,下面我们来学习字符串和字符串字面量的基本知识。


字符串字面量

想“ABC”那样带双引号的一系列字符称为字符串字面量(string literal)

在字符串字面量的末尾会被加上一个叫做null字符的值为0的字符,用八进制转义字符表示null字符就是‘\0’,用整数来表示就是0.

由三个字符组成的字符串字面量“ABC”实际上是占用了4个字符的内存空间,而双引号中没有任何字符的字符串字面量“ ”表示的就是null字符,如下图所示:


字符串字面量的长度

表示字符串字面量的长度,即所占有的内存空间的程序如下:


#include<stdio.h>

int main()
{
	printf("sizeof(\"123\"       = %u\n  ", (unsigned)sizeof("123")) ;  
	printf("sizeof(\"AB\\tC\"    = %u\n  ", (unsigned)sizeof("AB\tC")) ;  
	printf("sizeof(\"abc\\0def\" = %u\n  ", (unsigned)sizeof("abc\\0def")) ;  

	return 0;
}

下面我们来看它们在内存中的存储形式:

由运行结果可知,对于字符串字面量,运行环境会在末尾自动加上一个null字符,另外字符串字面量“AB\tC”中的“\t”表面上是两个字符,实际上是表示水平制表的转义字符,因此算作一个字符。

下面我们来总结下字符串字面量的性质:

◆具有静态生命周期

void func()
{
	puts("abc");
	puts("abc");
}

在上面的代码函数的功能是显示两次“abc”,调用该函数时就必须把字符串字面量传入puts函数,因此字符串字面量“abc”就必须“活在”程序的开始到结束的整个生命周期。

所以字符串字面量自然被赋予了静态生命周期。

◆对于同一个字符串字面量的处理方式依赖于编译器

func函数中有两个拼写完全相同的的字符串字面量“abc”,让我们来看下它们的储存方式:

如果将它们视为相同,并共用一个字符串字面量,这样就只需要5个空间即可,这样能减少所需要内存空间,如果将其视为不同,则需要10个字符的内存空间。


字符串

字符串字面量类似于整数的2、浮点数的3.14等常量,数值型数据可以通过变量的数据类型进行混合运算,而表示字符序列的字符串(string)也可以以对象的形式保存并灵活处理。

字符串最适合放在char数组中存储

 例如,要表示字符串“abc”,数组元素必须按下列顺序依次保存:

‘a’、‘b’、‘c’、‘\0’
“abc"abc\0
数组下标0123

末尾的null字符‘\0’是字符串结束的标志。

注意:字符串字面量“abc”是字符串,而字符串字面量“abc\0cd”却不是字符串。

以字符数组的形式保存并显示字符串“abc”的程序如下:

#include<stdio.h>

int main()
{
	char str[4];
	
	str[0] = 'a';
	str[1] = 'b';
	str[2] = 'c';
	str[3] = '\0';

	printf("字符串str为\"%s\".\n", str);
	
	return 0;
}

通过字符赋值给char[4]型的数组str的各元素,生成字符串“abc”,printf函数中表示字符串转换说明为%s(s表示的是字符串string的缩写),实参传递的是数组名。


字符数组的初始化赋值 

为保存字符串而将每个字符逐一赋予数组的各个元素并不是一件轻松的事情,所以我们可以进行如下声明:

	char str[4] = {'a', 'b', 'c', '\0'};

 这样不仅简洁,而且也能确保数组的初始化,且在形式上与int型、double型等初始化一致,另外还可以简化为以下形式:

char str[4] = "abc";

但是除了初始化的时候,我们不能将数组的初始值或字符串直接赋予变量,错误形式如下:

char s[4];
s = {'a', 'b', 'c', '\0'};
s = "abc";

空字符串

一个字符也没有的字符串,称为空字符串(null string),因为即使没有字符也需要表示结束的null字符,所以在内存空间上只有一个null字符,如下为声明空字符串的数组的声明示例:

char ns[] = " ";
//或者
char ns[] = {'\0'};

字符串的读取

下面我们来学习从键盘输入字符串的方法,下面是显示输入人名的程序:

#include<stdio.h>

int main()
{
	char name[50];
	
	printf("请输入你的名字:");
	scanf("%s", name);//这时scanf函数中的数组名前不能加上&
	
	printf("您好,%s先生/女士!!\n", name);
	return 0;
}

我们实现无法知道需要输入多少个字符,因此数组元素必须要容纳足够多的字符。

为了从标准输入读取字符串,需要把scanf函数的转换说明设为%s,还必须传入数组name,但是name前面不带&。

在scanf函数读取字符串存储数组中,会在末尾加上null字符,形式如下:

数组元素Mike\0
数组下标01234

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode 热题 HOT 100】题解笔记 —— Day03

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

职场利器-软考高级、PMP、CKA/CKS/CKAD备考

1、【软考高级】信息系统项目管理师 全国计算机技术与软件专业技术资格(水平)考试网上报名平台http://bm.ruankao.org.cn/sign/welcome 模拟作答系统230747 第一次裸考 考试成绩查询 三科均未通过 软考考试多少分通过? ​​​​​​​ 软考高级&#xff0c;它的考试科目是《…

黄鼠狼目标检测数据集VOC+YOLO格式400张

黄鼠狼是一种小型哺乳动物&#xff0c;通常分布在亚洲和欧洲的森林和草原地区。它们的身体长度约为30-50厘米&#xff0c;体重约为0.5-1.5千克。黄鼠狼的身体呈灰黄色&#xff0c;背部有黑色条纹&#xff0c;尾巴短而毛茸茸的。 黄鼠狼是一种夜行性动物&#xff0c;主要以小型…

网络通信--深入理解网络和TCP / IP协议

计算机网络体系结构 TCP/IP协议族 TCP / IP 网络传输中的数据术语 网络通信中的地址和端口 window端查看IP地址和MAC地址&#xff1a;ipconfig -all MAC层地址是在数据链路层的&#xff1b;IP工作在网络层的 MAC是48个字节&#xff0c;IP是32个字节 在子网&#xff08;局域…

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法

TIA博途Wincc_通过VBS脚本实现电机风扇或水泵旋转动画的具体方法 前面和大家介绍了通过在PLC中编程,结合HMI的图形IO域实现电机风扇或水泵旋转动画的具体方法,详细内容可参考以下链接: TIA博途Wincc中制作电机风扇或水泵旋转动画的具体方法示例 本次和大家分享通过VBS脚本实…

智能图像编辑软件Luminar Neo mac提供多种调整和滤镜选项

Luminar Neo mac是一款由Skylum公司开发的AI技术图像编辑软件&#xff0c;旨在为摄影师和视觉艺术家提供创意图像编辑解决方案。Luminar Neo拥有强大的AI技术和丰富的后期处理工具&#xff0c;可帮助用户快速轻松地实现从基本到高级的图像编辑需求。 Luminar Neo提供了多种调整…

什么是Vue.js ? Vue相关介绍

vue介绍 vue官网&#xff1a;Vue.js (vuejs.org) a) Vue.js目前最流行的一个前端框架&#xff0c;三大主流前端框架之一。 b) AngularJS是Vue早期开发的灵感来源。然而&#xff0c;AngularJS 中存在的许多问题&#xff0c;在 Vue 中已经得到解决。 c) Vue.js是一套构…

idea 注入mapper报错报红的几种解决方案

文章目录 前言方法1&#xff1a;为 Autowired 注解设置required false方法2&#xff1a;用 Resource 替换 Autowired方法3&#xff1a;在Mapper接口上加上Repository注解方法4&#xff1a;用Lombok方法5&#xff1a;把IDEA的警告关闭掉方法6&#xff1a;不用管他 前言 相信大…

Linux系统LVS+Keepalived群集

目录 一、概述 &#xff08;一&#xff09;群集特性 1.负载均衡 2.健康检查&#xff08;探针&#xff09; 3.故障转移 &#xff08;二&#xff09;Keepalived 1.作用 &#xff08;1&#xff09;支持故障自动转移 &#xff08;2&#xff09;支持节点健康状态检…

WebGL开发三维解剖学应用

开发基于 WebGL 的三维解剖学应用通常涉及以下步骤。这些步骤包括创建三维模型、整合交互性、优化性能等&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.三维模型创建&#xff1a; 首先&#xff0…

Pytorch项目,肺癌检测项目之二

diameter_dict{} with open(/xunlian/annotations.csv &#xff0c;‘r’) as f: for row in list(csv.reader(f)[1:]): series_uid row[0] annotationCenter_xyz tuple([float(x) for x in row[1:4]]) annotationDiameter_mm float(row[4]) diameter_dict.setdefault(seri…

【GIS前言技术】甘肃积石山6.2级地震烈度图

12月18日23时59分&#xff0c;甘肃临夏州积石山县发生6.2级地震。地震发生后&#xff0c;应急管理部组织中国地震局派出地震现场工作队&#xff0c;依照《地震现场工作&#xff1a;调查规范》&#xff08;GB/T 18208.3-2011&#xff09;、《中国地震烈度表》(GB/T 17742-2020)&…

josef约瑟 电流继电器 RL-D1 电压AC220V 整定范围0-9.99AAC

系列型号 RL-D1型电流继电器&#xff1b; RL-D2型电流继电器&#xff1b; 基本参数 RL-D系列电流继电器用于发电机、变压器和输电线的过负荷和短路保护装置中作为启动元件。本继电器为集成电路型继电器&#xff0c;精度高、功耗小、动作时间快&#xff0c; 返回系数高、整定…

0.618算法和基于Armijo准则的线搜索回退法

0.618代码如下&#xff1a; import math # 定义函数h(t) t^3 - 2t 1 def h(t): return t**3 - 2*t 1 # 0.618算法 def golden_section_search(a, b, epsilon): ratio 0.618 while (b - a) > epsilon: x1 b - ratio * (b - a) x2 a ratio * (b - a) h_…

九:爬虫-MongoDB基础

MongoDB介绍 MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大&#xff0c;其…

Java设计模式-原型模式

目录 一、克隆羊问题 二、传统方式解决 三、基本介绍 四、浅拷贝和深拷贝 &#xff08;一&#xff09;浅拷贝介绍 &#xff08;二&#xff09;深拷贝 五、原型模式深拷贝 &#xff08;一&#xff09;重写clone方法 &#xff08;二&#xff09;对象序列化 六、注意事项…

法线贴图实现地形模型皱褶、凹凸不平的纹理效果

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 法线贴图在3D建模中扮演着重要的角色&#xff0c;它通过模拟表面的微…

es倒排索引以及分词

单词词典(Term Dictionary)是倒排索引的重要组成记录所有文档的单词&#xff0c;一般都比较大 记录单词到倒排排列表的关联信息 倒排列表(Posting List)记录了单词对应的文档集合&#xff0c;由倒排索项( Posting )组成倒排索项( Posting)主要包含如下信息: 文档Id&#xff0c…

前端基础location的使用

概念 获取当前页面的地址信息&#xff0c;还可以修改某些属性&#xff0c;实现页面跳转和刷新等。 样例展示 window.location 含义.originURL 基础地址&#xff0c;包括协议名、域名和端口号.protocol协议 (http: 或 https:).host域名端口号.hostname域名.port端口号.pathname路…

postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升

最近遇到一个问题&#xff0c;就是不同源的两个网页之间进行localstorage或者cookie的共享。 上周其实遇到过一次&#xff0c;觉得麻烦就让后端换了种方式处理了&#xff0c;昨天又遇到了同样的问题。 使用场景 比如从网页A通过iframe跳转到网页B&#xff0c;而且这两个网页…