目录

一.strlen求字符串长度函数

二.strcpy字符串拷贝函数

三.strcat字符串追加函数

四.strcmp字符串比较函数

五. strncpy字符串受限拷贝函数

六.strncat字符串受限追加函数

七.strncpy字符串受限拷贝函数

八.strncmp字符串受限比较函数

九.strstr字符串查找函数

十.strtok

十一.strerror错误报告函数

十二.字符分类函数


本章重点:

重点介绍处理字符和字符串的库函数的使用和注意事项

求字符串长度

strlen

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

strcpy strcat strcmp

长度受限制的字符串函数介绍

strncpy strncat strncmp

字符串查找

strstr strtok

错误信息报告

strerror

字符操作

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组中。

字符串常量 适用于那些对它不做修改的字符串函数

字符串常量:

字符数组:

以下所有函数都需要#include<string.h>头文件 

一.strlen求字符串长度函数

函数原型:

  • 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含'\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 ),size_t是unsigned int类型
  • 返回长度

字符串函数中必须要有'\0'

模拟实现strlen:

//strlen模拟实现
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{assert(str);//断言函数int count = 0;while (*str++ != '\0')//只要没有遇到\0就++{count++;}return count;
}int main()
{char arr[] = "abcdef";int a = my_strlen(arr);printf("%d\n", a);return 0;
}

运行结果:

二.strcpy字符串拷贝函数

函数原型:

原字符串指:想要拷贝内容到其他空间的字符串

目标空间指:即将被拷贝内容的字符串

  • 将源指向的字符串复制到目标所指向的数组中,包括终止空字符(并在此时停止)
  • 源字符串必须以 '\0' 结束
  • 会将源字符串中的 '\0' 拷贝到目标空间(易忘)
  • 目标空间必须足够大,以确保能存放源字符串
  • 目标空间必须可变,(上述的字符串常量就是不可修改)
  • 返回目标空间起始地址

strcpy函数实现:

//strcpy模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{assert(dest);assert(src);char* ret = dest;while (*ret++ = *src++){;}return dest;
}int main()
{char arr1[20] = "abc";char arr2[] = "hello word";printf("%s\n", my_strcpy(arr1, arr2));return 0;
}

运行结果:

三.strcat字符串追加函数

函数原型:

  • 将源字符串追加到目标字符串。目标空间的\0字符,在目标中被源的第一个字符覆盖,向后面覆盖结束直到源字符串\0也拷贝进去,从而组成新的字符串。 
  • 源字符串和目标字符串必须有 '\0',源字符串中'\0'是什么时候结束,目标字符串中的'\0'是什么时候开始 。
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改
  • 不适合给自己添加:
  • 返回目标空间起始地址

strcat模拟实现:

//strcat模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{//1.找目标空间中的\0char* cur = dest;while (*cur){cur++;}//2.拷贝源头数据到\0之后的空间while (*cur++ = *src++)//\0拷贝到cur后为假结束{;}return dest;
}int main()
{char arr1[20] = "hello \0xxxxxxxxx";char arr2[] = "world";printf("%s\n", my_strcat(arr1, arr2));return 0;
}

运行结果:

遇到\0停止打印

四.strcmp字符串比较函数

只比较大小不会改变值,两个指针的加上const提高函数健壮性

  • 由于字符类型对应的是ASII码值,比较的是每一个元素值的大小并不是长度
  • 一个一个元素的比较大小,只比较\0之前的
  • 两个字符串必须有\0,遇到\0结束

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

strcmp函数实现:

//strcmp模拟实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* s1, const char* s2)
{assert(s1 && s2);while (*s1 == *s2)//两个元素一样进来,不一样返回{if (*s1 == '\0')//如果都遇到\0证明两个大小一样放回0{return 0;}s1++;s2++;}return *s1 - *s2;
}int main()
{char arr[] = "abcdef";char arr2[] = "abcdd";int ret = my_strcmp(arr, arr2);if (ret < 0)printf("arr1<arr2\n");else if(ret>0)printf("arr1>arr2\n");elseprintf("arr1==arr2\n");return 0;
}

运行结果:

上述讲的都是长度不受限的字符串函数,接下来讲受限的字符串函数

五. strncpy字符串受限拷贝函数

主要不同:

num是以字节为单位,字符类型只占一个字节,所以输入几就拷贝几个字符过去(之后的受限函数同理)

  • 拷贝num个字符从源字符串到目标空间
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
  • 返回目标空间起始地址

strncpy模拟实现:

//strncpy模拟实现
#include<stdio.h>
#include<assert.h>char* my_strncpy(char* dest, const char* src, size_t num)
{assert(dest && src);char* ret = dest;while (num && (*dest++ = *src++)) // 拷贝字符串{num--;}if (num) // 当count大于src的长度时,将补充空字符{while (--num){*dest++ = '\0';}}return ret;
}int main()
{char arr1[] = "123456789";char arr2[] = "abde";printf("%s\n", my_strncpy(arr1, arr2, 2));return 0;
}

运行结果:

六.strncat字符串受限追加函数

  • 将源字符串的前 num 个字符追加到目标,外加一个\0
  • strncat适合给自己追加
  • 返回目标空间起始地址

七.strncpy字符串受限拷贝函数

  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
  • 返回目标空间起始地址

num比源字符串大(arr2)同理补\0

八.strncmp字符串受限比较函数

函数原型:

  • 由于字符类型对应的是ASII码值,比较的是每一个元素值的大小并不是长度
  • 比较的是num个arr1和arr2个字符

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

九.strstr字符串查找函数

函数原型:

  • 在一个字符串中找另一个字符串是否存在,存在返回子串第一次出现的起始地址
  • 不存在返回NULL

实现代码思路分析:

模拟实现:

//strstr模拟实现
#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{const char* s1 = str1;const char* s2 = str2;const char* p = str1;while (*p != '\0'){//重新指向开始比较的地址s1 = p;s2 = str2;while(*s1 != '\0' && *s2 != '\0' && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0')//s2等于\0了说明已经比较完了{return (char*)p;//找到了}p++;}return NULL;
}int main()
{char arr1[] = "abcdefabcdef";char arr2[] = "cde";char* pc = my_strstr(arr1, arr2);if (pc == NULL){printf("不存在");}else{printf("%s",pc);}return 0;
}

实现结果:

十.strtok

函数原型:

  • sep参数是个字符串,定义了用作分隔符的字符集合:
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾(分隔符改为\0),返回一个指向这个标记的指针(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

函数使用:

  • 第一次之后就不能这样传了,只=只能传NULL,除非要换对象:
  • 但是这样写也太龊了,用一个巧妙的写法:

十一.strerror错误报告函数

函数原型:

功能: 把错误码转换成错误信息

里面的0.1.2.3.4就是C语言中的错误码

返回的是打印字符串的起始地址

#include<errno.h>

errno用来记录错误码

发生错误就会把错误码自动记录在errno变量中

这里再给大家介绍一个函数:

需要包含头文件:#include<stdio.h>

不放自定义信息的时候:

这样才符合语法

就相当于perror = printf + strerror

但是他依然是从errno中拿错误码打印

好处是可以加自定义的信息

使用

在只想打印错误信息的时候用:perror

在想要拿到错误码的时候用:strerror

十二.字符分类函数

都需要引头文件:#include<stype.h>

函数 如果他的参数符合下列条件就返回真
iscntrl 任何控制字符
isspace 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit 十进制数字 0~9
isxdigit 十六进制数字,包括所有十进制数字,小写字母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 任何可打印字符,包括图形字符和空白字符

用一个函数举例使用:

字符转换函数:

int tolower ( int c );       //转小写
int toupper ( int c );      //转大写

tolower 若是小写不变

toupper 若是大写不变

制作不易,你们的回馈是作者最大的动力!!!

C-字符串函数合集模拟实现介绍注意事项相关推荐

  1. Python 数据分析三剑客之 NumPy(五):数学 / 算术 / 统计 / 排序 / 条件 / 判断函数合集

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  2. 【Python常用函数合集】clip函数、range函数等

    你应该听说过,应用Python,可以让你处理一天的重复工作量,缩短到几分钟甚至更短.从此解放上班时间,研究更多更有效率的工作方法.进一步提升工作效率,让工作更出彩.这不是广告,这是实锤图片.    本 ...

  3. 洛克人红色思考型机器人叫什么_红色英雄归来《洛克人Zero:合集》人物介绍...

    CAPCOM确认,集结了过去GBA版游戏<洛克人Zero>系列4代作品的<洛克人Zero:合集>即将于2010年4月22日发售,这个游戏描述了于<洛克人X>系列中登 ...

  4. php、git、redis函数合集

    ################################PHP################################### 一. 数学函数 1.abs(): 求绝对值 求绝对值 $a ...

  5. SQL基础常用函数合集

    AVG avg()函数是一个聚合函数(聚合函数:对一组值执行计算并返回单一的值的函数,常见的有sum.max.min.count等),用于计算从select语句中返回的数值数据集的平均值. 牛客.SQ ...

  6. Python 函数合集:足足 68 个内置函数请收好

    公众号关注 "视学算法" 设为 "星标",DLCV消息即可送达! 来源:pypypypy www.cnblogs.com/pypypy/p/12011506.h ...

  7. 怎么理解回调函数? 回调函数合集

    网上查了一通,有点体会,特来分享与讨论. ******************************************************************************* ...

  8. php 求数组合集,PHP数组排序函数合集 以及它们之间的联系分析

    下边提到的几个数组函数的排序有一些共性:1 数组被作为排序函数的参数,排序以后,数组本身就发生了改变,函数的返回值为bool类型. 2 函数名中出现单a表示association,含义为,在按值排序的 ...

  9. Python函数合集:足足68个内置函数请收好!

    来源: https://www.cnblogs.com/pypypy/p/12011506.html 内置函数就是python给你提供的, 拿来直接用的函数,比如print.,input等.截止到py ...

最新文章

  1. 函数指针--全局函数指针与类的函数指针(二)
  2. 进程间通信的方式(三):消息队列
  3. python3 console input_Python console.colorize方法代码示例
  4. db2 最近三个月_昙花一现,PA、PC月跌1800,通用料一蹶不振,救不起的塑市!
  5. 如何将 ipynb 发布到 blog 中(html, markdown格式)
  6. LeetCode 452. 用最少数量的箭打破气球(贪心)
  7. Java常见面试知识点:继承、接口、多态、代码块
  8. 水滴石穿C语言之static辨析
  9. Wireshark实战分析之IP协议(三)
  10. fiddler抓包手机app数据(手机连接WiFi)
  11. 超强合集:OCR文本检测干货汇总(含论文、源码、demo等资源)
  12. 覆盖率验证——代码覆盖率+功能覆盖率
  13. java.util之ArrayList使用
  14. win7查看隐藏文件_u盘删除文件怎么恢复?
  15. 小雷的冰茶几(并查集)
  16. 花花世界迷人眼,没有实力别赛脸,做Python实力派(万字精华,初学者,收藏必备!!!)
  17. python函数的传参(bert_vocab_from_dataset),函数括号里面含有**是什么意思?
  18. 智慧农业:自动气象站
  19. iOS抓包工具Charles基本抓包步骤
  20. 有趣的第一人称和第三人称游戏

热门文章

  1. KKFileView(八)——系统配置
  2. 全网最详细完备的class类文件结构解析
  3. 云服务器连接Redis步骤
  4. linux下修改maven本地仓库repository地址
  5. 服务器输入信号超出,U盘安装CentOS显示“输入信号超出范围”解决
  6. SOC上的Flash
  7. Word2010制作三线表
  8. 武汉传媒学院有计算机专业吗,2019武汉传媒学院专业排名
  9. servlet过滤器原理及使用
  10. 记录华为云开放安全组端口依旧无法使用