当前位置: 首页 > news >正文

C语言从头学30——字符串

1.基本概念
       C语言没有独立的字符串类型,字符串被当作字符数组处理。但在处理字符串时,在字符串最后一个字符后边会自动添加一个全是二进制 0 的字节,写作 "\0" 字符,表示字符串结束。所有字符串的最后一个字符,都是 "\0" 。这样不需知道字符串的长度,就可以读取内存里面的字符串,一旦读到字符 "\0" 则字符串结束。也由此,声明的字符串长度与实际能存放的字符串长度差一个,即 "\0" 。
       正因为字符串是字符数组,所以有关数组的操作对于字符串同样适用。
       字符串数组赋初值可以写成大括号内单引号引着的一个个字符。这样写是太麻烦,实际中的字符串赋初值是用一对双引号把连续字符引起来;它与字符数组等价,但形式简单。例如:
       char myStr[] = "Hello World!";  //强调:这种写法只能是在字符数组声明时赋初值
       上面声明的字符串,名:myStr 长度:13(包含空格、结尾"\0")。这个 "\0" 一定要牢记,比如:char a='1'; 与char a[] = "1";  这两者一个是双引号一个是单引号,区别就在 "\0"上,"1"不但有1还有 "\0",而'1'只有1。
       如果字符串中,本身就包含双引号怎么办呢?给双引号前边加上一个反斜杠(称为转义符)即\",就把双引号加到字符串中了。
       上面的举例如写成:myStr[]="Hello ""World";(即连续的几对双引号都赋给一个字符串)也是符合语法的,不会报错。
       在printf函数中输出字符串:常量直接输出,变量用%s占位符输出。
2.字符串变量的声明
      字符串变量可以按字符数组形式声明,也可以用指向字符数组的指针形式进行声明。
      char myStr[1024] = "C语言从头学"; //声明长度1024字节实际使用不了会初始化成 "\0"
                                                              //如果不写具体长度只写空的[ ],计算机会自己计算所需要的长度
      char* myStr = "C语言从头学";
      上面的声明形式上差不多,但还是有差异,表现在:
       a.字符数组声明的字符串变量可以一个一个字符进行修改,但不能重新赋值;
              char a[]="1134"; a[0]='0'; a[1]='2'; //合乎语法
             但如果:a[]="4311"; //会报错
       b.指针方式声明的字符串变量可以重新赋值,但不能单个字符进行修改;
              char* b="1111"; b="2222"; //合乎语法
              但如果:b[0]='2'; //可能报错或出现错误运算结果
3.说明:单独字符能不能修改的原因:为什么字符串声明为指针时不能单独字符修改,声明为数组时就可以修改?原因是声明为指针时,字符串是一个保存在内存“栈区”的常量,“栈区”的值由系统管理,一般都不允许修改;声明为数组时,字符串的副本会被拷贝到内存“堆区”,“堆区”的值由用户管理,是可以修改的。整个字符串能不能修改原因:以指针形式声明的字符串变量,因为其是变量故可以指向其它的字符串;而字符数组变量虽称作变量但不能指向另一个字符串,因为字符数组的数组名总是指向初始化时的地址,不能修改。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#/WPF 自制截图工具
  • ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法
  • 陈志泊主编《数据库原理及应用教程第4版微课版》的实验题目参考答案实验2
  • Nuxt3 的生命周期和钩子函数(十一)
  • 【十三】图解 Spring 核心数据结构:BeanDefinition 其二
  • Poker Game, Run Fast
  • 【C++】模板进阶--保姆级解析(什么是非类型模板参数?什么是模板的特化?模板的特化如何应用?)
  • 基于Python爬虫的城市二手房数据分析可视化
  • 算法系列--分治排序|再谈快速排序|快速排序的优化|快速选择算法
  • 在 .NET 8 Web API 中实现弹性
  • ONLYOFFICE 8.1——全新桌面编辑器,相见恨晚
  • R 数据重塑
  • 算法训练营day06 哈希表(统计数,去重,降低时间复杂度)
  • Springboot项目接入支付宝SDK
  • py基础语法简述
  • [译]如何构建服务器端web组件,为何要构建?
  • 4. 路由到控制器 - Laravel从零开始教程
  • Angular 2 DI - IoC DI - 1
  • ES6语法详解(一)
  • Fastjson的基本使用方法大全
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Laravel 中的一个后期静态绑定
  • ng6--错误信息小结(持续更新)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Service Worker
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 技术:超级实用的电脑小技巧
  • 将 Measurements 和 Units 应用到物理学
  • 微服务核心架构梳理
  • 详解移动APP与web APP的区别
  • 小程序01:wepy框架整合iview webapp UI
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 怎么将电脑中的声音录制成WAV格式
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Redis 实现计数器和限速器的
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • #传输# #传输数据判断#
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (¥1011)-(一千零一拾一元整)输出
  • (1)常见O(n^2)排序算法解析
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (回溯) LeetCode 78. 子集
  • (南京观海微电子)——示波器使用介绍
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 托管代码与非托管代码
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • [1] 平面(Plane)图形的生成算法
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票