字符函数和字符串函数(C语言)(1,2,3,4)
注意:
字符串在C语言中的特性:
字符函数和字符串函数(C语言)(1,2,3,4)
函数介绍:
字符函数和字符串函数(C语言)(1,2,3,4)
本节重点:
字符函数和字符串函数(C语言)(1,2,3,4)
都是以\0为结束标志的函数
长度不受限制的意思是不能自己指定追加几个字符
一直运算直到遇到\0程序结束
很容易越界访问
字符函数和字符串函数(C语言)(1,2,3,4)
1.strlen字符串长度
计算字符串的长度
统计字符串'\0'前的字符个数
字符函数和字符串函数(C语言)(1,2,3,4)
strlen函数的使用
使用要点:
1.函数的实际参数是地址
2.计算’\0‘前的字符个数,‘\0’不算字符串内容,不计算
3.函数的返回值是无符号数
字符函数和字符串函数(C语言)(1,2,3,4)
“”双引号引出字符串内容
默认加上了'\0'结束标志
而单引号引出单个字符,无结束标志'\0'
当使用''单引号时strlen函数将一直往后找,直到找到'\0'时,统计'\0'之前的字符个属于
字符函数和字符串函数(C语言)(1,2,3,4)
经典题型:(小心被坑)
strlen函数返回的是无符号数
3-6=-3
负数的补码看做是无符号数那将特别大
字符函数和字符串函数(C语言)(1,2,3,4)
***strlen函数的模拟实现方式
因为字符地址不被改变
可以修改为const char* str
1.创建临时变量计数器
字符函数和字符串函数(C语言)(1,2,3,4)
2.函数的递归(不能创建临时变量,求字符串长度)
字符函数和字符串函数(C语言)(1,2,3,4)
3.指针
字符函数和字符串函数(C语言)(1,2,3,4)
2.strcpy字符串拷贝函数
将一个字符串拷贝到另一个字符串中
字符函数和字符串函数(C语言)(1,2,3,4)
strcpy函数的使用
使用要点:
1.arr1目的地,arr2源头意思是将arr2中的内容拷贝放到arr1中
2.'\0'也会拷贝
3.h被w替代,e被o替代.......
字符函数和字符串函数(C语言)(1,2,3,4)
***strcpy函数的模拟实现方式
指针
字符函数和字符串函数(C语言)(1,2,3,4)
代码改良:
1.1代
字符函数和字符串函数(C语言)(1,2,3,4)
2.2代
先后置++,在与*结合
发现:先两个字符赋值,赋值后地址+1,跳到下一字符,在根据赋值后的结果充当判断条件,如果赋值0,destination将变为0,不符合循环条件,将跳出循环
{;}为空语句
返回目的空间的起始地址
字符函数和字符串函数(C语言)(1,2,3,4)
推荐2代
注意:
1.原字符串中必须包含'\0',否则将会越界访问,导致出错
字符函数和字符串函数(C语言)(1,2,3,4)
2.目标空间足够大以至于存的下我的字符串,否则也会越界
字符函数和字符串函数(C语言)(1,2,3,4)
3.目标空间必须可修改,不是常量字符串,常量字符串不可修改
字符函数和字符串函数(C语言)(1,2,3,4)
3.strcat字符串追加
在一个字符串后追加一个字符串
字符函数和字符串函数(C语言)(1,2,3,4)
strcat函数的使用
将arr1的内容追加到arr2中
字符函数和字符串函数(C语言)(1,2,3,4)
使用要点:
1.目标空间足够大以至于存的下我的字符串,否则也会越界
字符函数和字符串函数(C语言)(1,2,3,4)
2.两个字符串都必须包含'\0'
目的地字符串中必须包含'\0',说明我从'\0'处开始追加
源头地字符串中必须包含'\0',说明我追加结束了
最后也会将'\0'追加到目的地中
字符函数和字符串函数(C语言)(1,2,3,4)
3.不能自己给自己追加字符串,程序会崩溃
字符函数和字符串函数(C语言)(1,2,3,4)
为什么不能自己给自己追加?
内容被修改,源头处的'\0'被覆盖,没有'\0'了,会导致死循环,代码会崩溃
代码实现strcat函数:
字符函数和字符串函数(C语言)(1,2,3,4)
代码优化:
字符函数和字符串函数(C语言)(1,2,3,4)
4.strcmp
初学者比较字符串函数时喜欢(错误示例):
字符函数和字符串函数(C语言)(1,2,3,4)
一串常量字符串存储在一块空间内,每次使用这个字符串,都将根据这条字符串的首元素地址调用这块空间存储的字符串(字符串不可修改)
所以这两个常量字符串的首字符的地址相同所以打印hehe
如果两个字符串不相同说明,存储在不同的两块空间中
两个字符串的首元素地址就算是同为a但是字符串的首元素地址还是不同
所以打印haha
字符函数和字符串函数(C语言)(1,2,3,4)
不推荐使用这样的方式判断两个字符串是否相等
还有这样(错误示例):
字符函数和字符串函数(C语言)(1,2,3,4)
如果使用数组接收字符串
那么每条字符串都将存储在不同的空间中,每个数组的首元素地址都将不同,找到的字符串的存储空间也不同(字符串可修改)
字符函数和字符串函数(C语言)(1,2,3,4)
使用strcmp函数(正确的方法)
可以比较数组存储的字符串
也可以比较常量字符串
如:
字符函数和字符串函数(C语言)(1,2,3,4)
1.传递的是字符串的地址
2.引用头文件#include \<stdio.h>
3.const意思是字符串只用来比较,不会被改变,如果变了,会报错
字符函数和字符串函数(C语言)(1,2,3,4)
返回值
字符函数和字符串函数(C语言)(1,2,3,4)
两个字符串的每个字符进行比较:
ch1字符串中的第一个字符a的ASCII码值等于ch2字符串中的第一个字符a的ASCII码值,返回0
ch1字符串中的第二个字符z的ASCII码值大于ch2字符串中的第二个字符a的ASCII码值,返回一个正数,比较结束(VS编译器返回的是1,其他的编译器不一定)
如果ch1字符串中的第n个字符的ASCII码值小于ch2字符串中的第n个字符的ASCII码值,返回一个负数,比较结束(VS编译器返回的是-1,其他的编译器不一定)
字符函数和字符串函数(C语言)(1,2,3,4)
字符函数和字符串函数(C语言)(1,2,3,4)
所以:
这种写法是错误的,代码具有局限性:
字符函数和字符串函数(C语言)(1,2,3,4)
应该这样实现:
字符函数和字符串函数(C语言)(1,2,3,4)
my_strcmp的函数实现
方法1:
字符函数和字符串函数(C语言)(1,2,3,4)
方法2:
字符函数和字符串函数(C语言)(1,2,3,4)