当前课程知识点:程序设计基础 > 第七章 文本数据处理 > 7.2 统计活跃用户数 > 7.2.2 字符串
其实啊 早在我们在第四章引入数组的概念之前
我们其实就一直默默的使用着字符数组
只不过呢 当时这个写法看上去实在是很好理解
大家也没有去深究 我们也没有去特别的强调
而且当时还有很好听的一个名字
我们会管它叫字符串
比如说很多参考书上会教大家写的
第一个程序当中会有输出这样一句
“Hello world”这样一个程序
那这个双引号里面这样一段字符串
这就是一个 我们称之为字符串的一个长的字符串
那这样一个引号里面一串字符这样一个写法
到底代表的是一个什么意思 或者说
这样一个写法在计算机当中是如何给它表达出来的
我们来看一下 实际上 表达的是一片连续的空间
这个空间当中的每一个格子会放上一个字符
而且呢 这个结尾 会有一个特殊的字符
这个\0 那看我们画的这个表格
其实就跟这个字符的数组完全是一样的
那唯一特殊的就是后面这个\0
这个\0什么意思呢 其实就是数值的0
那我们知道ASCII码表当中会给
每一个字符都分配一个对应的数值
那字符的0呢其实对应的数值并不是0
大家之前也可以翻一翻相关的参考书
那反过来 如果是数值的0那对应字符是什么呢
就是我们刚才这个'\0' C语言呢
用'\0'这样一个特殊的字符来表示字符串结束
因为这个正常的字符串前面可显示的字符
hello 一大串 都不会涉及到
应该都不会出现数值0这么样一个值
所以呢 用这样一个值表达的是字符串的结束
也就是说 我这个数组其实不一定多大
也可能非常大 但是里面的内容呢
我只关心到出现\0为止 后面的我就不关心了
这是一个字符串想表达的意思
那知道了这一点 我们看一下这两种写法
一个呢 是我们之前可能会见到的这种
char str[10]一个大括号
去初始化一个字符的数组
这是正常的一个大括号里面放上一些值来
对这个数组进行初始化
那因为是char类型的数组
所以里面的每一项都是char类型的一个常量
那上面这一种 看上去很简洁的
这两种写法 其实就是完全等价的一个写法
就是上面这个双引号的Hello
其实等价于下面大括号的一串最后加一个\0
就是一定要注意最后多了一个
跟我们平时初始化多了一个这个\0
正是因为字符串数组有字符串这样一个特殊的意义
所以才给了它这种非常简洁的一个写法
像下面这个写法显然写起来比较麻烦
那C++语言呢 也对字符串给了它一些特殊的处理
比如说我们之前会用到的
可以对它进行一个cout的输出
也可以对它进行一个cin的输入
那之前我们说cout和cin
输入输出的应该是一个变量
你直接把一个数组交给它
按理说应该是会提示错误的
大家可以去试一下 如果把一个int的数组
那个数组的名字写在str的这个位置
应该是会编译出错的 但是只有字符的数组
写在这个位置是不会出错的
反而呢 是给了它一个特殊的意义
除此之外呢
C语言还提供了一系列的处理字符串的函数
就是类似的我们第一章讲到的
那些数学函数处理一些数学运算一样
处理字符串的函数 我给大家列出来几个常用的
这些函数要使用它 同样要包含一个特殊的头文件
就是cstring的这样一个头文件
那常用的strlen这是string length
求字符串的长度 注意这是字符串的长度
而不是数组的长度 咱们说数组可以很长
但是里面字符串的长度到哪呢
我就关心到\0的那个位置
这里面字符串的长度 就是我们“hello”
就是hello五个 这就是长度为五
不计最后那个\0的长度
那第二条strcpy 实际上是
string copy的一个缩写
是字符串的复制 然后strcmp
是string compare字符串的比较
然后strcat是字符串的连接
这些函数具体的函数的声明
大家可以去查一些相关的资料
到现在呢 咱们应该能看懂函数的声明了
如果呢 我们需要表达一个字符串的数组
那咱们上面说了实际上应该是一个二维的数组
比如说我写成这样 char strs[4][10]
我后面给了一些初始值 那这种写法
想要表达的是我要存储最多4个字符串
每个字符串最多10个字符
也就是 二维数组前面这个4代表的是
字符串的个数 后面这个10代表的是
每一个字符串当中最多有但是个字符
下面我给它做了初始化 注意一下
我一旦写成这样的初始化 双引号的写法
其实都可以替换成刚才大括号里面单引号
的一个一个字符 最后加一个单引号\0的写法
所以注意一下最后 虽然我写成了“Hello”
但是这实际上占了6个字节的空间
因为最后还有一个\0
所以实际上咱们这个数组初始化成定义成
[10]的时候 说它最多包含10个字符
实际上呢 这个10个字符里还包括了那个\0
所以最多包含9个有意义的字符
如果你写一个双引号里面有10个 那就越界了
有了这样的一个定义和初始化呢
数组里面每一项就都是一个字符串
跟我们之前这个变量数组的定义都是类似的
比如说呢 我们可以通过下面这条语句
对strs的第二项求一个字符串的长度
然后把它输出出来
那根据咱们刚才这个初始化的结果
strs的第二项应该是这个双引号的C++
给它求一个长度 那求长度呢是不计那个\0了
就应该是C一个字节 +一个字节
再+一个字节 最后输出的结果就应该是3
其他的一些函数大家可以自己去做一下练习
我这里就不给大家演示了 那下一段呢
我们会应用这些字符串的知识来完成
咱们刚才的统计活跃用户的这样一个问题
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测