[C][字符串][字符串常用函数介绍]详细讲解


0.前言

  • 本篇主要介绍处理字符和字符串的库函数的使用及其注意事项
    • 求字符串长度
      • strlen
    • 长度不受限制的字符串函数
      • strcpy
      • strcat
      • strcmp
    • 长度受限制的字符串函数介绍
      • strncpy
      • strncat
      • strncmp
    • 字符串查找
      • strstr
      • strtok
    • 错误信息报告
      • strerror
    • 字符操作
    • 内存操作函数
      • memcpy
      • memmove
      • memset
      • memcmp
  • C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组
    • 字符串常量适用于那些对它不做修改的字符串函数
  • 相邻字符串(“”)具有自动连接特性
  • 字符串在结尾的位置隐藏了一个\0的字符
  • \0是字符串的结束标志

1.gets

  • 函数原型char* gets(char* str)
  • 从标准输入stdin读取一行,并把它存储在str所指向的字符串中
    • 当读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定
  • 相较scanf的好处:遇到“ ”也可继续往后读写,直到遇到换行符

2.strlen

  • 函数原型size_t strlen(const char* str)
  • 字符串以'\0'作为结束标志,strlen()返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')
  • 参数指向的字符串必须要以'\0'结束
  • 注意:函数的返回值类型为size_t,是无符号

3.strcpy

  • 函数原型char* strcpy(char* dest, const char* src)
  • 功能:将源字符指向的C字符串复制到目标指向的数组中,会将源字符串中的'\0'拷贝到目标空间
  • 源字符串必须以'\0'结束
  • 目标空间必须足够大,以确保能存放源字符串
  • 目标空间必须可变

4.strncpy

  • 函数原型char* strncpy(char* dest, const char* src, size_t num)
  • 功能:将源字符串的前num个字符从源字符串到目标空间
    • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num

5.strcat - (效率低)

  • 函数原型char* strcat(char* dest, const char* src
  • 功能:把src所指向的字符串追加dest所指向的字符串的结尾
  • 源字符串必须以 '\0’结束
  • 目标空间必须有足够的大,能容纳下源字符串的内容
  • 目标空间必须可修改

6.strncat

  • 函数原型:`char* strncat(char* dest, const char* src, size_t num)
  • 功能:把src所指向的字符串追加到dest所指向的字符串的结尾,直到num字符长度为止
    • 如果源字符串的长度小于num,则仅复制终止字符'\0'之前的内容
  • 返回值:该函数返回一个指向最终的目标字符串dest的指针

7.strcmp

  • 函数原型int strcmp(const char* str1, const char* str2)
  • 功能:比较两个字符串,strcmp()开始比较每个字符串的第一个字符,如果它们彼此相等,则继续执行向后对比,直到字符不同或达到终止字符'\0'
  • 返回值
    • < 0 -> str1 < str2
    • 0 -> str1 == str2
    • > 0 -> str1 > str2

8.strncmp

  • 函数原型int strncmp(const char* str1, const char* str2, size_t num)
  • 功能:类似strcmp(),比较到出现第一个字符不一样或者一个字符串结束或者num个字符全部比较完

9.strstr

  • 函数原型char* strstr(const char* str1, const char* str2)
  • 功能:在字符串 str1 中查找第一次出现字符串str2的位置,不包含终止符'\0'
  • 返回值:返回在str1中第一次出现str2字符串的位置,如果未找到则返回NULL

10.strtok

  • 函数原型char* strtok(char* str, const char* sep)
  • 参数
    • sep包含分隔符的C字符串,可以是一个分隔符集合
      • 例如" ,.-"
    • str要被分解成一组小字符串的字符串
  • 功能strtok()找到str中的下一个子串,并将其用'\0'结尾,返回一个指向这个子串的指针
    • strtok()的第一个参数不为NULL,函数将找到str中第一个子串,strtok()将它保存常量字符串区(静态区)
    • strtok()的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个子串
      • strtok()维护的缓冲区有"记忆功能",倘若连续分割同一个字符串,则除了第一次调用外,后续调用第一个参数传NULL即可
    • 如果字符串中不存在更多的子串,则返回NULL
  • 注意strtok()会改变被操作的字符串,所以在使用strtok()切分的字符串一般都是临时拷贝的内容并且可修改

11.strerror

  • 函数原型char* strerror(int errnum)
  • 功能:返回错误码,所对应的错误信息
    • 使用库函数的时候,调用库函数失败的时候,都会设置错误码(全局的错误码)
  • 头文件errno.h

12.perror(相对于strerror可能更好用)

  • 函数原型:`void perror(const char* str)
  • 功能:把一个描述性错误消息输出到标准错误stderr
    • 首先输出字符串str,后跟一个冒号,然后是一个空格
  • perror()相对于strerror()可能更好用

13.ctype.h

  • 该头文件下的接口用于测试和映射字符
  • 如果参数c满足描述的条件,则这些函数返回非零(true),如果参数c不满足描述的条件,则这些函数返回零(false)
函数如果它的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格' ',换页'f',换行\n,回车\r,制表符\t或者垂直制表符\v
isdigit十进制数字(0~9)
isxdigit十六进制数字,包括所有十进制数字(0~9),字母(a~f A~F)
islower小写字母a~z
isupper大写字母A~Z
isalpha字母(a~z A~Z)
isalnum字母(a~z A~Z) 或者 数字(0~9)
ispunct标点符号,任何不属于数组或者字母的圆形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符
tolower把大写字母转换为小写字母
toupper把小写字母转化为大写字母

14.memcpy

  • 函数原型void* memcpy(void* dest, const void* src, size_t num)
  • 功能memcpy()src的位置开始向后复制num个字节的数据到dest的内存位置
    • memcpy()在遇到'\0'的时候并不会停下来
    • 毕竟是内存操作函数,不是字符串操作函数
  • 注意:如果srcdest有任何的重叠,复制的结果都是未定义的
  • 返回值:返回一个指向目标存储区dest的指针

15.memmove

  • 函数原型void* memmove(void* dest, const void* src, size_t num)
  • 功能:类似memcpy(),和memcpy()差别memmove()处理的源内存块和目标内存块是可以重叠的
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理

16.memcmp

  • 函数原型int memcmp(const void* ptr1, const void* ptr2, size_t num)
  • 功能:和strcmp()类似,但是是以字节为单位进行比较

17.memset

函数原型void* memset(void* str, int c, size_t n)
功能:以字节为单位设置内存


18.atoi

  • 函数原型int atoi(const char* str)
  • 功能:把参数str所指向的字符串转换为一个整数(类型为int)
  • 参数str – 要转换为整数的字符串
  • 返回值:返回转换后的整数,如果没有执行有效的转换,则返回零
  • 依赖库<stdlib.h>
  • 29
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DieSnowK

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

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

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

打赏作者

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

抵扣说明:

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

余额充值