你好, 欢迎回来｡ 在这节课中, 我想从字符串函数开始｡
我前面提到过, 字符串､
字符数组在C中不是变量数据类型｡
所以你可以使用任何运算符, 但是你仍然需要能够对字符串做很多事情｡
你就能操纵他们了｡
你会想要得到长度｡
你想比较它们, 各种各样的东西可能会转换它们｡
幸运的是, 标准库提供了一系列函数,
您可以使用这些函数来执行这些类型的操作｡
我会先讲一些最常见的然后我们会在其他课上讲一些更具体的.
所以我们已经知道字符串是一个以空字符结尾的字符数组｡
字符串在c程序中是常用的｡
幸运的是, C语言提供了许多专门用于处理字符串的函数｡
我们将要讨论的是您将使用的最常用的方法｡
首先, 使用str length函数获取字符串的长度｡
将一个字符串复制到另一个字符串｡
请记住, 我之前告诉过你, 你不能使用赋值运算符来赋值字符串｡
所以你要做的就是使用str copy或者strn copy｡
此外, 将两个字符串组合在一起称为连接｡
有一只猫和一只猫｡
以及确定两个字符串是否相等｡
同样, equals等于运算符不适用于比较字符串, 因为它们是数组｡
所以如果你想比较字符串, 你必须使用c库提供的特殊函数｡
字符串比较和字符串比较｡
首先, 我们来谈谈长度｡
所有这些函数都是在字符串中定义的｡
头文件, 因此在调用或调用其中一个函数时必须包含该文件｡
获取字符串的长度｡
Str length是一个函数, 它计算字符串的长度, 非常简单.
它将作为大小t变量返回｡
你可以将size t变量和int变量互换使用｡
但首先, 如果要使用字符串长度, 则必须包含字符串头文件,
这就是它使用方法｡
你基本上是在双引号内创建一个字符串, 然后把它赋给一个字符数组｡
不指定字符数组的大小｡
编译器将为您执行此操作, 并添加空终止符｡
一旦你用字符串常量定义了字符串,
你就可以调用string length, 然后传入那个字符, 非常好｡
这是最常用的方法之一, 因为当你做验证检查或其他任何事情时,
你经常想得到这个长度的字符串,
如果你想确保没有缓冲区溢出, 你也可以这样做｡
此函数会更改字符串｡
因此函数头在声明形参字符串时不使用常量｡
如果你去看看弦｡
h, 您会发现它没有被定义为常量｡
正在复制字符串｡
复制字符串或者是修改现有的字符串,
或者是修改其中包含一些数据的现有字符数组｡
或者如果里面什么都没有, 你想放点东西进去｡
因为你不能在c中赋值raise, 所以你也不能赋值string｡ 我在前面提到过,
声明一个字符, 然后使用equals赋值运算符是无效的｡
所以你要做的就是使用str复制函数把一个字符串复制到一个现有的字符串中｡
它相当于字符串的运算符, 赋值运算符｡
如果我们声明了两个字符数组source和destination,
我们所要做的就是说str copy source,
然后不管源是什么, 我们都可以把它放在字符串中, destination也是一样.
如果你想复制变量, 你也可以在里面放变量｡
但我们在这里要做的是第一个参数是你要复制到的地方｡
第二个参数是要复制的字符串｡
所以在str复制之后, source里面会有this is source.
Destination或dest在str copy调用后会将this is
destination包含在其中｡
str复制函数不检查源字符串是否确实适合目标字符串｡
如果你有一根很大的弦会发生什么｡
在上一个例子中, 如果目的地包含100个字符, 会发生什么情况？
而不是把这个作为目的地, 它有100个字符｡
您尝试将其复制到只有50个字符的源文件中｡
那就有问题了｡
目标字符串将大于要复制的源字符串｡
所以如果我们试图把str copy复制到source中而不是把这个复制到source中,
我们把这个复制到source中, 不管它是什么的5倍或者10倍, 50分之一, 都会有一个错误｡
我来演示一下｡
因此, 复制字符串的一种更安全的方法是使用strn copy｡ 你会注意到n可以变成strn copy｡
Strn copy需要第三个参数｡
要复制的最大字符数｡
在这里, 您实际上指定了要复制的内容｡
如果源文件大小为40,
目标文件大小为12, 你可以先做一个m集合, 将目标文件中的数据大小设置为空终结符,
这样当你添加一些东西时, 它会自动出现, 不用担心｡
str副本会把hello how are you doing复制到源代码中,
它不会检查how, how are doing是否大于源代码.
但是如果你复制一个字符串,
然后复制到目的地, 它会复制源代码, 而且只复制前10个字符.
因此第三个参数应该对应于目标大小｡
让我们进入代码块, 看看字符串长度, 看看复制字符串,
看看它们是如何工作的｡
这里, 我们有我们的主要｡
而要得到字符串长度的字符串确实很容易｡
我们将创建字符数组｡ 我们知道如何创建一个字符区｡ 我们不想指定大小,
但我们必须先放名称, 然后放括号｡
然后我们可以用任何我们想要的东西初始化它, 比如用双引号｡
双引号代表字串常值｡
所以我就说我叫杰森｡
最后的结果是s将是一个17个字符的数组｡
所有这些字符加上空终止符｡
空终止符是反斜杠零｡
你不必把它放在那里, 因为它是由编译器自动添加的｡
这就是我们在字符数组中初始化和创建字符串的方法｡
然后要打印它, 我们要做的就是说printf, 长度是.
然后我们把percent s作为格式说明符来显示一个字符串｡
然后我们要做的就是说出字符串的名字｡
为了避免混淆, 我们就说我的字符串.
我们不需要像之前那样使用&符号, 我们可以直接说我的字符串｡
如果我们编译并运行它, 我们可能还必须确保包含字符串头｡
当我们编译并运行它的时候, 你会看到字符串的长度｡
所以长度是我没有调用字符串长度函数｡
所以如果你想显示长度, 你必须调用这个函数, 就像这样.
你把字符串放在str length里面｡
现在当你运行它的时候, 你会看到字符串的长度｡
这不能是字串, 而是实际的｡
这就是字符串的显示方式｡ 如果我想显示字符串的长度,
我会在调用函数时执行% d｡
当我运行它的时候, 你会注意到它实际上打印出了16, 这是长度｡
所以使用字符串长度是非常简单的｡ 如果要复制字符串,
请使用str compare｡
并且您希望使用strn compare来实际指定字节｡
这里如果我们有我的名字是Jason,
然后我们创建另一个字符串, 实际上我们只保留它｡
我们甚至不需要指定, 我们要做的就是创建另一个名为temp的字符串,
它将等于str, 然后比较, 我们要传入我们要复制到的内容.
创建一个空的字符数组, 我们把它的大小设为50.
这里我们要做的是, 复制字符串｡
第一个参数是我们要复制的位置, 我们称之为temp｡
第二个参数是我们要复制的字符串｡
我们不想传入超过50个字节｡
所以我们实际上可以说, 我们不想传递超过50个字节的临时变量的大小｡
您可能希望为空终止符设置-1｡
这样, 第三个参数就非常重要了, 因为我们永远不会发生缓冲区溢出｡
您应该始终使用strn copy而不是str copy｡
然后在这里我们可以显示字符串, 看看它是否被复制了｡
我们可以说是临时的, 把它改成百分之几｡
当我们构建这个的时候, 我们应该看到, 不是长度, 我们应该看到字符串是这样的,
并以分号结尾｡
现在我们应该编译我们做的｡
所以现在我们运行它｡ 我们应该只看到被复制进来的字符串｡
我们看到我的名字是Jason, 它存储在temp中,
因为我们打印出了temp｡
但始终使用strn copy｡
不要使用字符串复制, 这样可以确保不会出现缓冲区溢出｡
第三个参数应该始终是目标,
而不是源, 目标｡
复制整个字符串是没有意义的｡
因为如果这是小的, 你会有问题｡ 所以总是说这个的大小｡
你可以看到, 你可以使用sizeof操作符来查看字符内部有多少字节｡
让我们再讨论一些函数｡
所以我们知道如何得到长度, 我们知道如何复制字符串, 如何连接字符串｡
str
cap函数有两个参数, 两个字符串作为参数, 它将第二个字符串复制到第一个字符串的末尾｡
第二个字符串没有改变, 只有第一个字符串｡
它将返回它的第一个参数的值｡
第二个字符串追加到的字符串的第一个字符的地址｡
所以返回一些东西, 告诉你你实际上是在哪里追加的, 如果你需要的话｡
这里有一个例子, 我们创建了一个字符串,
它只包含了一个空终止符.
我们创建了一个字符串输入, 它是80, 它是空的｡
我们说输入一个要连接的字符串｡ 我们读过了｡
然后我们把它连接起来｡
我们打印出原始字符串, 然后是连接字符串, 最后是输入｡
所以在这之后, 无论你输入什么,
都会放在我的字符串的末尾｡ 所以如果你输入Jason, 它就是我的空格字符串Jason｡
这就是我的字符串的值｡
因为你在上面做了一个字符串｡
首先我们打印出字符串, 然后调用str cat｡
Input实际上等于输入的内容, 字符串后面跟输入的内容.
我们马上就来看看这个例子｡ 现在, 就像str
copy一样, str cat也有一个strn end cat｡
因此, 组合版本成为新的第一个字符串｡
所以就像字符串连接和str cat一样, 有一个strn
cat｡
Str cat与str copy也有同样的问题｡ 它可能有缓冲区溢出｡
它实际上并不确定第二个字符串是否适合第一个数组｡
因此, 如果第一个数组中没有足够的空间, 则可能会遇到缓冲区溢出问题｡
所以你想用一只猫｡
第二个参数指示要添加的最大字符数｡
举个例子,
如果你做一个strn cat和两个字符串bug一个add-on, 它只会把add-on的前13个字符添加到bug中, 这取决于哪一个先出现｡
如果add-on小于13, 则它只会添加到您看到空终止符为止｡
在这个例子中, 我们创建了两个字符串｡
这是此目标的源｡ 我们要做一只猫｡
我们只复制了15个字符到目的地的最后｡
所以不管目的地的大小是多少, 都是目的地的大小加上15, 然后我们打印出来｡
让我们再看一下代码块｡
这是我们的例子, 我们将创建两个字符串数组, 一个大小为50,
另一个大小为50.
我们将执行两次字符串复制, 将它们设置为data.
这是源的目标｡ 然后在第12行, 我们做strn cat｡
目的地就是我们连接到的东西｡
所以源就是我们要连接的东西｡
我们只分配15个字符｡
所以如果源大于15, 我们就不会复制所有的源｡
当我们构建并运行它时,
您会看到它现在显示“这是源文件”, 或者显示“这是目标文件”, 然后显示“这是源文件”｡
所以它说这是目地, 这是来源
它将其连接到目的地的末尾｡
因此, 您总是希望使用strn cat进行连接, 这样就不会出现缓冲区溢出｡
让我们来讨论一下str比较, 我一直不小心说它, 而不是str复制,
str比较｡
所以为了比较字符串, 我们还必须使用函数｡
如果你想比较一个字符串和另一个字符串,
你不能使用double equals, 它只检查是否有相同的地址｡
所以你需要使用str compare｡
这将比较字符串内容｡
它不会比较数组｡
因此它可以用来比较存储在不同大小数组中的字符串｡
它不比较字符｡
您可以在双引号中使用apples和a等参数, 但不能使用单字符a等字符参数｡
此函数对字符串的作用与关系运算符对数字的作用相同｡
所以比较函数会返回一个值, 告诉你字符串是否相等, 是否大于,
或者是否小于.
如果相等, 它将返回零｡
如果小于, 它会返回小于0的值, 如果str1小于str2｡
如果第二个字符串小于第一个字符串它会返回大于零的值｡
那么这到底意味着什么呢？
好吧, 让我给你举个例子来说明这是如何工作的｡
让我们把它放到代码块中运行｡
但是这里我们做了一系列的str比较, 我们会告诉你这些值是什么, 是小于还是大于,
因为这不是很清楚｡
让我们以代码块的形式来看一下｡
这是我们的例子｡ 我们比较了一堆字符串,
然后只显示str比较的结果, 不管是01还是别的什么.
所以如果你比较两个字符串a和a, 它们必须用双引号引起来｡
你在这里看到的就是我们正在做的就是打印出我们所称的｡
所以我们要给引号定界｡
我们用反斜杠来打印出一个引号字符, 而不是字符串的结尾. 但是如果我们比较a和a,
这应该返回零｡ 因为零意味着字符串是相等的｡
如果我们比较a和b, str compare应该返回小于｡
因为a小于b｡
B应返回一个大于零的值｡
但让我们检查一下, 确保我没有犯任何错误,
我们会在输出中看到它｡
所以当我们运行这个程序的时候, 这可以帮助你记住, 会返回什么数字｡
所以当你比较a和a的时候, 你实际上得到0｡
如果你比较a和b,
b小于a, 所以它是负1, 小于0的东西,
我可能会说相反的话, 看, 即使我还是把他们弄糊涂了｡
因为a大于b, a大于b, 负一｡
B小于a, 所以你得到了大于0的值, 也就是1.
C大于a, 所以你得到1, 只是当b大于a的时候｡
然后你要比较大小写｡
当你比较大写和小写时, 它做相反的事情｡ Z实际上小于小写的a｡
所以大写字母总是小于小写字母｡
如果你试着比较苹果和苹果, 它会是1, 因为苹果比苹果小｡
这就是比较的原理｡ 理解0大于1或小于1很重要｡
同样小于零表示第一个字符串小于第二个字符串｡
大于零意味着第一个字符串大于第二个字符串｡
这个功能非常好用｡
你不必担心任何类型的字符串比较, 因为它与你要比较的数组的大小无关｡
str compare函数比较字符串, 直到找到不同的对应字符｡
所以它可能一直到其中一根弦的末端｡
Strn比较函数比较字符串, 直到它们不同或比较的字符数达到第三个参数指定的值｡
因此, 在这种情况下, 您不需要使用strn
compare来处理缓冲区溢出｡
它是存在的, 但只有在只想比较一定数量的字符时才使用它｡
它的用法和str
copy, strn copy, strn cat都不一样.
strn compare只是说我只想显示这么多字符｡
因此, 如果您只查找前缀, 它将非常有用｡
因此, 如果你想搜索以astro开始的字符串,
你可以将搜索限制在前五个字符, 这样你就可以使用strn
compare｡
所以这个例子你可以看到我们说等于等于零｡
在使用str compare时, 经常会看到这样的if语句｡
在这个语句中可以看到str compare和equals equals zero, 它们是相等的｡
所以strn compare使用了前五个字符,
将astro与天文学的前五个字符进行比较｡
它会说它找到了｡ 它会等于零, 它会说发现天文学｡
如果你做同样的事情, 但是把它和一个不同的字符串做比较,
它不会找到它, 它实际上会显示出来—它会说,
令人震惊的比天文大｡ 所以它会显示大于0的值,
也就是1, 它不会显示任何数据｡
因此, 在比较所有内容的字符串时, 请使用str compare｡
当您只想比较前缀和字符串时, 请使用strn compare｡
相同类型语法或字符串只比较第三个参数｡
我们讨论了很多我们将要用到的重要函数,
主要是字符串长度, 字符串复制,
字符串分类, 字符串比较｡
我们将面临一个挑战, 您必须利用这些功能来熟悉它｡
但是你会对这些非常熟悉因为你会一遍又一遍地使用它们.
-谢谢—谢谢