C风格的字符串赋值方式

文章目录


(1)C语言中,没有字符串类型但可以用字符数组模拟字符串。
(2)C语言中,字符串是以’\0’作结尾字符。
(3)C语言中,字符串常量本质上是一个无名的字符数组。

C风格的字符串有两种声明方式:
1. char str1 [] = “abc”;或 char str2[]={‘a’,‘b’,‘c’,‘\0’};//数组赋值
2. char * str3 =“abc”;
这两种方式都表示的是字符串数组。字符数组和字符串的区别 就看最后一个元素后面是否存在’\0’,有’\0’就是字符
串,没有就是普通数组。
如上 char arr[] ={‘a’,‘b’,‘c’};就是表示的是普通字符数组,但不是字符串。
如果字符数组中没有’\0’结尾,那该字符数组就是普通的字符数组,不是字符串。
字符串和字符数组很相似,但是有本质上的区别。
(1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自动在结尾加上’\0’字符。字符串常量存储在只读数据段,无法通
过指针进行修改字符串中的某个字符。
(2)C语言中,不能定义字符串(没有string关键字,C++才有),但是在C语言中使用字符串,通常会用字符数组来模拟字符串,必须
是’\0’结尾的字符数组,这个字符数组存储通常会分配在栈区(例如:char str [] = “abc”; 中的str就存储在栈区),也可以被称为字符
串,且该字符串中的字符是可以修改的。
C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。那么,字符数组就一定是字符串吗?答:字符串一定是字符数组,但是字符数组不一定是字符串。
在这里插入图片描述
现在的编译器,已经不允许 使用 char * str = “abc”;这种形式声明定义字符串了,必须前面 加上 const。这也是标准的
方式:const char * str = “abc”;即使 char * str = “abc”; 在编译期,不报错,但是想通过 str[0] = ‘f’;修改静态区的字符串常量时,会报错。
所以这里最好在 char * str 前面 加上const。解决编译器不错报,而运行期报错的问题。
求普通数组和字符串的长度的方法:
如int a[] = {1,2,3,4}; char b[] = {‘a’,‘b’,‘c’};
正确方法是:数组a长度 = sizeof(a)/sizeof(a[0]) 或 sizeof(a)/sizeof(int)
数组b长度 = sizeof(b)/sizeof(b[0]) 或 sizeof(b)/sizeof(char)
字符串的长度计算:用strlen()方法。
函数原型 unsigned int strlen (char s);
strlen()方法说明:从字符串的开头位置依次往后面计数,直到遇到’\0’停止,所计算的字符串大小为’\0’以前的字符所计算的值,最终的字符串长度不包括’\0’;
例如:
char str1[] = {‘a’,‘b’,‘c’,‘d’,‘\0’};//strlen(str1) == 4 ,而sizeof(str1)= = 5 ,原因是sizeof运算符统计占用字节数时,含’\0’。
char str2[] = {‘a’,‘b’,‘\0’,‘c’,‘d’,‘\0’};//strlen(str2) == 2
char str3[] = {‘a’,‘b’,‘\0’,‘c’,‘d’};//strlen(str3) == 2
char str4[] =“abcd”;//strlen(str4) == 4,而sizeof(str1)= =5 原因同上
char
str5 = “abcd”;;//strlen(str5) == 4 ,而sizeof(str1) == 5 原因同上
注意:不要用此方法求普通字符数组的长度,有可能有的编译器会正确执行strlen()函数,但是这个方法是用来求字符串的长度的,不是用来求数组的长度的。上面的str1,str2,str3,str4 都是数组类型 ,因为数组名,就是数组首元素的地址(而且数组名,不用于自增或自减操作,数组名是一个指针常量,指向不能发生修改,形如:str1++,str1=str1+1;str4++;都是错误的,而str5++;str5=str5+1是合法的,这也是字符串两种赋值方式的其中一点不同之处),在传入strlen函数时,把数组名赋值给char * s变量 是可以的。

还有一个printf(“%s”,str1);//会输出abcd。底层原理,str1自动加1,把读取的元素,先缓存起来,直到遇到’\0’,时,把缓存起来的数据,打印到控制台上。
如果给上面的char b[] = {‘a’,‘b’,‘c’}; 使用 printf(“%s”,b);是不正规的,有的编译器会报错。正确的打印普通字符数组的方法是通过for循环,遍历打印。

还有形如: char * str5 = “中abc”;//就是这种字符串中含中文的,那么一个中文在UTF8编码下,这里占3个字节。用strlen计算其长度时出现6。而sizeof(str5) == 7; str5[0]的输出并不是“中”,而是中字所占的3个字节的,第一个字节。所以这里不能通过索引获取中文字。但是通过
printf(“=%s”,str5);//可以打印出 “中abc”,底层原理,将缓存起来的字节,按照unicode方式下的utf-8编码规则来解码,打印。

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

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

相关文章

代码自动发布系统

之前是jenkins发现gitlab代码更新了就自动获取直接部署到服务器 现在是jenkins自动获取Code之后打包成镜像上传到仓库然后通知docker去拉取更新的镜像 分析 旧∶ 代码发布环境提前准备,以主机为颗粒度静态 新: 代码发布环境多套,以容器为颗粒度编译 …

适合销售使用的CRM系统特点

销售人员抱怨CRM系统太复杂,这是一个很重要的问题。毕竟,如果系统太难使用,会导致CRM实用率和效率下降,最终影响公司的运作。在这篇文章中,我们来探讨当销售抱怨crm客户系统太复杂了,企业该如何解决。 缺少…

VCS4 debug with DVE

1、重点讲解: 在verilog源代码中嵌入VCD 系统函数,重点如testbench文件中。VCD文件是VCS产生的仿真波形文件,未经压缩,占用空间较大。VCD是压缩后的波形文件。 编译、仿真以生成VCD文件。 在后处理模式中使用激活DVElog对产生的…

NodeJS Cluster模块基础教程

Cluster简介 默认情况下,Node.js不会利用所有的CPU,即使机器有多个CPU。一旦这个进程崩掉,那么整个 web 服务就崩掉了。 应用部署到多核服务器时,为了充分利用多核 CPU 资源一般启动多个 NodeJS 进程提供服务,这时就…

当ChatGPT续写《红楼梦》,能替代原著吗?

来源: 清华大学出版社 近段时间,人工智能聊天机器人ChatGPT火爆网络,“AI写作是否会让文字工作者被替代?”成为人们关注并持续讨论的话题。 闲聊、问答、解题、写代码、写诗、创作小说, 连续回答,不断纠错&#xff0c…

拥抱自动化测试,快速升职加薪丄Selenium+Pytest自动化测试框架教你如何做到

目录:导读 引言 SeleniumPytest自动化测试框架是目前最流行的自动化测试工具之一,其强大的功能和易用性援助许多开发人员和测试人员。 selenium自动化 pytest测试框架禅道实战 选用的测试网址为我电脑本地搭建的禅道 conftest.py更改 config.ini更…

MyBatis配置文件 —— 相关标签详解

目录 一、Mybatis配置文件 — properties标签 二、Mybatis配置文件 — settings标签 三、Mybatis配置文件 — plugins标签 四、Mybatis配置文件 — typeAliases标签 五、Mybatis配置文件 — environments标签 六、Mybatis配置文件 — mappers标签 一、Mybatis配置文件 —…

2023年第十四届蓝桥杯 C++ B组参赛经验总结

没错,今年本菜狗又来啦~~ hhh , 文章当时比赛完就写完了, 发的有点晚 比赛成绩 (等出来我就写这里) 感觉最多省二 估计没省一了555 赛前准备 赛前把蓝桥杯课基本都刷了 , 但是还是感觉有点慌 刷题经验 …

【网络原理】网络通信与协议

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录一. 网络发展史二. 网络通信基础1. IP地址2. 端口号3. 认识协议(核心概念)4. 五元组5. 协议分层6. 封装和分用一. 网络发展史 独立模式:计…

springboot从2.1.3升级到2.3.5后控制台自动输出http请求日志RequestResponseBodyMethodProcessor

springboot从2.1.3升级到2.3.5后控制台自动输出http请求日志RequestResponseBodyMethodProcessor和RequestMappingHandlerMapping推荐使用第二个方案简单 明了 方便 快捷方案一第一步定义TurboFilter第二步配置logback方案二 直接配置logback的配置XML推荐使用第二个方案简单 明…

【三十天精通 Vue 3】 第四天 Vue 3的模板语法详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 模板语法概述1. Vue 3 模板语法的简介2. Vue 3 模板…

Openlayers(五)点位聚合Cluster

Openlayers(五)点位聚合Cluster 1.业务问题 由于点位在地图上显示过多,会造成页面卡顿、点位标注信息相互叠加导致看不清 优化后效果 不断放大层级 2.聚合类Cluster OpenLayers 中聚合是通过 ol.source.Cluster 实现,聚合的原…

Flink的窗口机制

窗口机制 tumble(滚动窗口) hop(滑动窗口) session(会话窗口) cumulate(渐进式窗口) Over(聚合窗口) 滚动窗口(tumble) 概念 滚…

系统复杂度之【高性能】

系统复杂度之【高性能】 今天我们来谈一谈系统复杂度的根源之【高性能】 对性能的不懈追求一直是人类科技持续发展的核心动力。例如计算机,从电子管计算机到晶体管计算机,再到集成电路计算机,运算性能从每秒几次提高到每秒几亿次。然而&#…

VUE_学习笔记

一、 xx 二、模板语法 1.模板语法之差值语法 :{{ }} 主要研究:{{ 这里可以写什么}} 在data中声明的变量、函数等都可以。常量只要是合法的javascript表达式,都可以。模板表达式都被放在沙盒中,只能访问全局变量的一个白名单&a…

【微服务笔记14】微服务组件之Config配置中心高可用环境搭建

这篇文章,主要介绍微服务组件之Config配置中心高可用环境搭建。 目录 一、高可用Config配置中心 1.1、高可用配置中心介绍 1.2、搭建Eureka注册中心 1.3、搭建ConfigServer服务端 (1)引入依赖 (2)添加配置文件 …

Jetson nano部署剪枝YOLOv8

目录前言一、YOLOv8模型剪枝训练1. Pretrain[option]1.1 项目的克隆1.2 数据集1.3 训练2. Constraint training3. Prune4. finetune二、YOLOv8模型剪枝部署1. 源码下载2. 环境配置2.1 trtexec环境变量设置3. ONNX导出3.1 Transpose节点的添加3.2 Resize节点解析的问题4. 运行4.…

FIFO的工作原理及其设计

1.简介 FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。 对于单片FIFO来说,主要有两种…

SHELL函数可课后作业

一、题目 1、编写函数,实现打印绿色OK和红色FAILED 判断是否有参数,存在为Ok,不存在为FAILED 2、编写函数,实现判断是否无位置参数,如无参数,提示错误 3、编写函数实现两个数字做为参数,返回最…

多线程 之 CAS与synchronized的优化过程

前言 本篇介绍什么是CAS与synchronized的优化过程,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录前言1. 什么是CAS?2. CAS实现的操作2.1 实现原子类2.2 实现自旋锁3. CAS的aba问题4. synchr…
最新文章