你好, 欢迎回来｡
在这节课中,
我想讲一下创建一个字符串, 特别是在c语言中如何用字符数组来实现｡
我倾向于交替使用字符串和字符串这两个术语｡
但字符串实际上是我们将要讨论的字符数组｡
这是一个非常重要的概念｡
我们现在可以在程序中使用文字和文本来做各种事情｡
现在, c本身没有任何表示字符串的数据类型｡
那里什么都没有
许多语言都支援物件或字串型别的数据型别｡
因为string中没有数据类型c, 所以不能对string使用任何运算符｡
所以我们最后要做的就是使用标准库, 我们会讨论各种字符串函数｡
我们有三堂课专门讲各种字符串函数.
这将帮助我们操纵这些字符串, 得到关于这些字符串的信息｡
但是你不能在字符串上使用运算符, 不能加或减字符串,
什么都不是｡
c中的字符串存储在char类型的数组中｡
我们知道什么是数组｡ 我们知道什么是类型char｡
char类型是一个单一的字符, 一个数组,
你可以用同一个名字存储多个元素｡
所以字符串在字符数组中是有意义的因为字符串是由很多字符组成的.
因此, 字符串的字符被存储在相邻的存储单元中, 每个单元一个字符｡
您可以像访问数组一样访问它｡
但实际上, 声明一个字符串的方法是, 简单地使用char类型,
然后用括号来表示大小, 就像普通的数组一样,
如果你要创建不同类型的数组.
字符, 然后是你的名字,
然后是方括号内的字符数组的大小｡
这就是在c中声明字符串的方法｡
现在, 当你像这样在c中声明字符串时,
并没有与关联的实际数据｡ 您只是指定大小｡
这是最简单的方法｡
因此, 该变量可以容纳最多包含19个字符的字符串｡
请记住此空字符｡
如果你说你的字符串大小是20,
那就意味着实际上只能存储19个字符, 因为你必须为空值增加一个额外的字符｡
请记住, 声明一个字符数组为20意味着可以在其中存储19个字符｡
当指定要在字符串之前使用的数组的维数以存储字符串时, 该维数必须至少比要存储的字符串中的字符数大1｡
编译器将自动在每个字符串常量的末尾添加空终止符｡
所以当你创建这些字符串的时候, 你应该做的是初始化它们｡
所以你可以初始化一个字符串变量就像你可以初始化一个数组｡
你把每个字符放在这些括号里｡
因此, 这看起来非常类似于初始化整数数组中的元素｡
但是如果你说char,
word, 然后在花括号里放上每个字符, 这就创建了一个字符数组｡
所以它和其他数组初始化是一样的｡
在没有输入大小的情况下, c编译器会自动计算数组中的元素数, 然后为空终止符加一｡
所以它是基于初始化器的个数, 在括号里, 大括号里.
这条语句将为七个字符保留空间和内存, h-e-l-l-o感叹号, 然后是空终止符,
右边的这个小图表显示了这一点｡
自动添加空终止符｡
现在,
如果你总是用单引号后跟逗号来初始化你的字符数组, 那就真的很麻烦了｡
所以你能做的就是用双引号把它括起来｡
所以你可以显式地指定字符串,
就像第一个例子一样, 然后你必须使用一个字符串函数来应用数据, 或者你可以让编译器为你做这件事｡
显式执行的问题是, 您必须始终记住为null添加额外的字符｡
所以你真正应该做的是让编译器来帮你解决｡
所以不要在括号内填入任何数字｡
因为如果指定的长度太小,
编译器就无法在数组的末尾加上终止空字符, 它不会在那里放一个, 也不会告诉你它没有在那里放一个.
所以你的程序中会有一个bug, 你甚至都不知道｡
最佳实践是当您使用字符串文字并且初始化字符串时, 让编译器计算出字符串的大小｡
把它做一个大一点的尺寸什么的, 然后只要把它放进去, 它就会帮你算出尺寸｡
所以不要指定大小｡ 让编译器来解决它｡
这样你就可以确保它是正确的｡
只要把这些括号保留为空括号,
用赋值运算符赋值, 然后用双引号括起来就可以了.
你甚至不需要方括号｡
这是最好的做法｡ 我们来看一个例子｡
您也可以使用字串初始化char型别元素数组的一部分｡
所以如果你创建了一个很大的大小,
并且只分配了几个字符, 也没关系, 你只初始化了其中的一些字符.
所有其他字符都是空的｡
编译器将初始化前五个元素｡
字符串0到字符串4,
字符串常量的所有这些字符, 然后字符串sub 5将包含空字符｡
数组中的所有40个元素仍将分配空间,
但其中只有5个元素将被使用, 4个元素加上空字符｡
因此, 最佳实践并不是在size中指定一个数字,
而是使用双引号将其指定为字符串文字｡
这就是你最终会看到的｡
现在如果你没有初始化,
只是创建了一个字符数组, 大小为, 你怎么把日期放进去呢.
因为它是一个数组, 您不能只给数据赋值｡
我们知道如果我们有一个整型数组,
我们不能只给一个整型数组赋值5, 这没有意义｡
必须指定实际元素｡
您必须指定索引｡
所以你不能声明一个包含100个字符的字符数组, 然后说s等于hello｡
这是行不通的｡
因为s也是一个数组｡ 即使它是一个在双引号内的字符串, 它在内存中仍然是一个数组｡
因此, 如果你在执行赋值操作,
你不能像上面那样将一个字符数组赋值给另一个字符数组｡
如果在声明并初始化字符数组后, 想给它赋值, 就必须使用一个特殊的函数str
copy｡
我们会在另一节课上讨论这个问题｡
所以直到现在, 当你创建你的字符串时, 它们都是字符串文字,
它们都在双引号里, 你永远不会修改它们｡
所以这也是完全正确的｡ 实际上,
您可以通过索引访问这些字符或数组中的每个元素, 并指定每个字符｡
所以ssub0, ssub1, 然后把一个字符用单引号括起来｡
你可以这样分配｡ 但是想象一下, 如果你有一个100字节的字符串｡
这将需要很多行代码｡ 所以你不想这么做｡
你要做的就是在声明它的时候初始化它, 不带大小,
然后指定你是否要修改它, 你的str
copy｡
至于显示字符串作为输出, 我们仍然要使用printf函数｡
当你想在你的程序中的任何地方引用一个字符串时, 你只需要使用数组名本身｡
您不必指定索引｡
因为数组中的索引将指定单个字符｡
如果您想要整个字符串, 只需使用数组名｡
因此, 如果您使用printf函数来显示输出,
只需执行以下操作｡
在双引号内, 您可以使用percent s作为格式说明符, 然后只使用字符数组的名称｡
所以当你想访问它的时候, 你不能像对待其他数组一样对待它｡ 当你想访问它只是名称没有实际的索引或括号｡
而percent作为格式说明符用于输出以空结尾的字符串｡
还记得我们之前用percent d表示整数吗, 你可以用percent c表示字符.
对于字符串, 您使用percent s, 它们是字符数组｡
它需要某个以null结尾的字符串｡
但是, 如果你初始化了一个字符串, 没有指定长度,
并且自动添加了空终止符,
或者你创建了一个特定长度的字符串, 然后添加了它, 或者你显式地添加了它,
这都无关紧要. 它必须以空值终止｡
printf函数假定遇到percent
s格式说明符时, 相应的参数是一个以空字符结尾的字符串｡
这是它所期望的, 所以它必须这样做｡
要输入一个字符串, 我们知道如何使用scanf通过键盘输入其他数据集｡
输入字符串也是一样的｡
我们将使用scanf函数｡
对于scanf函数, 除了使用不同的格式说明符外, 其他方法都是一样的.
所以对于字符串, 你要用一个百分比作为输入｡
用来输入字符串｡
另一件需要注意的事情是变量名没有&符号, 因为它是一个字符｡
请记住, 我们提到过您只需要提供字符串中运算符的地址｡
原因是当我们谈论指针时, 它会更清楚｡
但是char输入,
即使是字符数组, 它也是一个指针, 而scanf作为它的第二个参数, 也是一个指针.
所以你不必这么做｡ 当您宣告整数和双精度浮点数时, 它们不是指标和｡
因此, 如果你想用scanf读取键盘输入, 第二个参数需要一个指针,
你必须传入一个地址｡
现在用scanf,
当你处理一个字符串时, scanf只会读到空格｡
所以如果你做scanf, 你输入杰森是一个教练｡
输入中唯一要存储的是Jason｡
因为一旦它到达那个空格, 它就不会读取字符串的其余部分｡
所以还有其他函数可以用来读取整个字符串.
我们将要用到的一些例子可能会做到这一点｡ 你可以做类似f
get s这样的事情, 这是另一种从键盘读取输入的方法, 它将读取整个字符串, 而不管空格｡
但是还有一个我认为叫做, 获取C11的下划线, 我们会更多地讨论这个,
但这只是当你阅读字符串输入时要记住的一件事｡
它只会一直读到空格｡
测试两个字符串是否相等｡
到目前为止,
我们已经测试了所有变量, 看看它们是否相等, 我们只使用equals｡
但是有了弦, 这就行不通了｡
等式运算符, 记住, 我们说过字符串是字符数组, 所以你不能在上面使用运算符｡
而相等运算符只能应用于整型和双精度型或浮点型或字符型｡
它不适用于结构或数组｡ 您无法比较两个数组｡
所以它不适用于字符串｡
如果要确定两个字符串是否相等, 则必须显式地逐个字符比较这两个字符串｡
所以你必须一个索引一个索引地查看数组中的每个元素｡
然而, 这真的是一个很大的问题, 因为这将是非常乏味的｡
我们将讨论如何使用标准库中的str比较函数, 来轻松地实现,
但不能使用equals, equals,
记住.
再次提醒一下,
我已经说过几次了, 我想再说一遍, 双引号里的字符串常量x和单引号里的字符常量x不一样｡
单引号内的X是一个基本类型, 它只是char或care｡
双引号内的X是一个驱动器类型, 它是一个char型数组｡
双引号内的X实际上由两个字符组成, x和空终止符,
空字符, 所以要记住这一点｡
下面是一个示例, 说明如何创建字符串, 或者在同一行声明它们的大小,
或者初始化它们｡
这是最好的做法｡
如果你要使用字符串, 我会按照这里所说的做, 创建字符数组,
不指定大小, 然后在赋值运算符的右边加上双引号.
编译器将自动创建正确的字符串, 并向其中添加空终止符｡
如果您指定了大小, 但没有足够的字符, 它将不会存储它｡
因此,
只需使用char数据类型､ 变量名和空括号创建字符串文字即可｡
这个程序要计算数组中的字符数, 所以它实际上是要得到字符串的长度.
我们在这里创建了一个名为count的变量, 在两个字符数组中, 有两个不同的字符串, to be或not
to be, 然后是逗号,
这就是问题所在｡
字符串1在b之后有一个交替符号, 而字符串在问题之后有一个替代符号｡
所以我们有一个循环,
它会遍历第一个数组, 从count等于0开始, 一直到我们看到一个null终结符.
我们可以用不等于因为我们在比较一个字符｡
作为字符的空终止符｡ 比较角色是完全可以的｡
所以我们的while循环会一直运行, 直到我们看到一个空终结符｡
一旦我们看到一个空终结符, 我们就跳出来｡
Count将等于该字符串中的字符数｡
这就是字符串的长度｡
我们对两根弦都这样做｡ 你会注意到,
基本上两个字符串的长度都是正确的, 因为我们只是逐一检查.
去b还是不去b大概是18个字符｡
你永远不需要做这样的事情因为我们有一个很好的辅助函数, 可以用str长度来求字符串的长度.
但是, 这再次证明了它是一个数组的事实｡
如果你想比较或者求出一个字符串的长度, 你可以使用not equals,
然后看看这个字符, null终止符｡
我希望这对你有帮助｡ 这就是我们要定义和初始化字符串的方法｡
-谢谢—谢谢