一篇文章带你搞懂字符串函数

一:长度不受限制的字符串函数

1.strlen

  • 首先给出在VS编译器下strlen函数的声明
  • size_t strlen(const char* str);
  • 这里的strlen 函数的返回类型size_t
  • 是VS里面自定义的一种类型,和unsigned int 相同
  • 故strlen最终会返回一个无符号整型,代表所求字符串的大小
  • 参数为一个char *类型的指针,(*str)整体被const修饰是为了防止指针str指向的内容即(*str)被修改
  • 作用:用来求出一个字符串的长度,不包括‘\0’
  • 简单例子:请添加图片描述
    本章中所有的字符串函数都需要先引用头文件<string.h>

2.strcpy

  • chat * strcpy(char * destination,const char * source)

  • 返回类型为char *,即字符指针,返回的是destination的地址

  • 参数为两个char *类型的指针,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于拷贝的字符串的首地址,为了防止source指向的内容被修改,故用const 修饰,而destination指向的内容要被修改,不加const(下文中有关const的部分不再强调)

  • 注意点:

  • 1:源字符串必须以‘\0’结束

  • 2:会将源字符串中的‘\0’拷贝到目标空间中

  • 3:目标空间必须足够大,确保能够存放源字符串

  • 作用:将一个字符串b的内容复制到另一个字符串a中,a中内容会被修改

  • 简单例子:

  • 请添加图片描述

  • 源字符串不以‘\0’带来的问题:

  • strcpy不知何时结束,会引发异常请添加图片描述

3.strcat

  • chat * strcat(char * destination,const char * source)
  • 返回类型为char *,即字符指针,返回的是destination的地址
  • 参数为两个char *类型的指针,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于追加的字符串的首地址
  • 注意点:
  • 1:源字符串必须以‘\0’结束
  • 2:会将源字符串中的‘\0’也追加到目标空间中
  • 3:目标空间必须足够大并且可以被修改,确保能够追加源字符串
  • 4:不能自我追加
  • 作用:将一个字符串b的内容追加到另一个字符串a中,a中内容会被修改
  • 简单例子:
    请添加图片描述
  • 自我追加不可行,但是用后面提及的strncat可以
    请添加图片描述

4.strcmp

int strcmp(const char * str1,const char *str2)

  • 返回类型为int
  • 如果str1>str2,返回大于0的数字
  • 如果str1=str2,返回等于0的数字
  • 如果str1<str2,返回小于0的数字
  • 或许你会疑惑两个字符串为什么不能用>,<,==来比较
  • 仔细想想,字符串名代表首元素的地址,你直接写if(str1<str2)是没有意义的
  • 这比较的是两个地址的大小,而地址是内存随机分配的,它们的大小都不是确定的
  • 参数为两个char *类型的指针,str1用于接收字符串1的首地址,str2字符串2的首地址
  • 究竟是如何比较的呢?
  • 是把字符串中的字符一个个比较它们的ASCALL码值,相等就比较下一个字符,不相等直接返回大于0或小于0,每个字符都相等才返回0
  • 作用:比较两个字符串的大小
  • 简单例子:
  • 请添加图片描述
    请添加图片描述
  • 字符‘W’的ASCALL码值大于字符‘C’的ASCALL码值,返回大于0的数字1

二:长度受限制的字符串函数

1.strncpy

  • chat * strncpy(char * destination,const char * source,size_t num)
  • 返回类型为char *,即字符指针,返回的是destination的地址
  • 参数为两个char *类型的指针和一个无符号整型,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于拷贝的字符串的首地址,num用于接收要拷贝的字符的个数
  • 作用:将一个字符串b的中num个字符复制到另一个字符串a中,a中内容会被修改
  • 优点:能控制复制字符的个数,更加安全
  • 简单例子:
  • 请添加图片描述

2.strncat

  • chat * strncat(char * destination,const char * source,size_t num)
  • 返回类型为char *,即字符指针,返回的是destination的地址
  • 参数为两个char *类型的指针和一个无符号整型,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于追加的字符串的首地址,num用来决定追加几个字符
    -可以实现自我追加
  • 作用:将一个字符串b中num个字符追加到另一个字符串a中,a中内容会被修改
  • 简单例子:
  • 请添加图片描述

3.strncmp

int strncmp(const char * str1,const char *str2,size_t num)

  • 返回类型为int
  • 参数为两个char *类型的指针,str1用于接收字符串1的首地址,str2字符串2的首地址
  • num决定比较前num个字符
  • 是把字符串中的字符一个个比较它们的ASCALL码值,相等就比较下一个字符,不相等直接返回大于0或小于0,每个字符都相等才返回0
  • 作用:比较两个字符串前num个字符的大小
  • 简单例子:
  • 可以看到,比较前6个字符时,两个串因为前6个字符相同,返回0
  • 而比较前7个字符时,由于a字符串第七个字符‘W’的ASCALL码 >b字符串的第七个字符’C’的ACSALL码,故返回大于0的数字1请添加图片描述

三:字符串查找函数strstr

char* strstr(const char * str1,const char *str2)

  • 返回类型为char*,在 str1中查找str2,若str2在str1中,则返回str2的首元素在str1中的地址
  • 比如str1=“abbbd”,str2=“bd”,会返回str1中第四个元素b的地址
  • 若str2不在str1中,则返回空指针NULL
  • 简单例子:
  • 可以看到,c 的地址和a[3]的地址相同,字符串d不在字符串a中,返回空指针
    请添加图片描述

四:分割字符串函数strtok

  • char * strtok(char * str,const char * sep)
  • 这是一个比较奇特的函数,使用的场景也较少
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。
  • 是不是感觉上面说的不是人话?看个例子应该能帮助你理解
    请添加图片描述
  • 总结:第一次传参是传入要分割的字符串,之后通通传入空指针即可
  • 你是不是觉得这样子使用很麻烦,我们可以用一个循环搞定它
  • 请添加图片描述
  • 初始化只有一次,我们需要传字符串a也只有一次,可以把ret=strtok(a,p)放在初始化条件上
  • 之后每次循环都传的是空指针NULL,故在3处写成ret=(NULL,p)一直循环
  • 当ret的返回值不是NULL时说明还没分割完,故循环条件为ret!=NULL

五:打印错误信息函数strerror

  • char *strerror(int errnum)
  • 返回值是一个指针变量char*
  • C语言中回根据参数errnum 不同的值返回不同的地址
  • 指向了不同的字符串,也就是不同的错误信息请添加图片描述
  • 实际中的应用:
  • 请添加图片描述
  • 其中errno为全局错误码,需要引用头文件<errno.h>,当我们打开一个不存在的文件时,发生了错误,全局错误码的值会自动被修改。
  • 我们只需要打印出来查看是什么错误即可。
  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dhdw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值