字符函数(strlen、strcpy、strcmp、strerror)
目录
一、strlen 函数
二、strcpy 函数
三、strcmp函数
四、strerror 函数
这里仅列举出了部分需要注意的函数,至于其他的 strcat、strtok函数没有列举出来。
一、strlen 函数
strlen 函数用于获取一个字符串的长度。本质是用一个变量cnt计数,只要不是'\0',cnt++,地址也向后移动一个单位;一旦遇到 '\0',停止计数并返回计数结果。
函数声明如下:
1、形参返回值解析
形参:输入一个 char* 类型,相当于提供字符串首元素的地址
返回值:返回你输入的字符串的长度
2、函数特点
(1) strlen 返回字符串中 '\0' 前面出现的字符数
'\0' 作为字符串的结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )
char* str1 = "hello"; // 5,注意末尾有个隐藏的'\0'char str2[] = "hello"; // 5char str2[] = {'h','e','l','l','o','\0'}; // 5char str2[] = {'h','e','l','l','o','\0','a','b','c'}; // 5,一遇到'\0',函数就会返回char str2[] = {'h','e','l','l','o'}; // 长度不确定,因为没有'\0',因为数组不会自动补充
(2) strlen函数的返回值是无符号整型
strlen函数的返回值是size_t,即unsigned int
int main() {const char* pstr1 = "hello,world";const char* pstr2 = "hello";if (strlen(pstr2) - strlen(pstr1) > 0){printf("大于");}else{printf("小于等于");}return 0;
}
无符号整型相减的结果依然是无符号整型,但strlen(pstr2) - strlen(pstr1) 的结果是 -6,所以这个 -6 在比较大小的时候需要倾向于范围较小的那一方,即转换成无符号类型。
-6 在内存中的补码为 10000000 00000000 00000000 00000110,现在要当作无符号来看,即所有的位置都是有效位,转换成原码就是
01111111 11111111 11111111 11111010
很显然这个数是 大于 0的,所以打印的结果是“大于”
二、strcpy 函数
strcpy函数 将源字符串里的所有字符(包括'\0')逐个拷贝到目标空间。拷贝时一旦遇到‘ \0 ’,此时会中止拷贝,先把'\0' 拷贝到目标地址, 然后再返回目标地址。
函数声明如下:
1、形参返回值解析
第一个参数:目标空间的地址,可以是一个数组首元素的地址,也可以是malloc出来的地址
第二个参数:源字符串首元素的地址
返回值:返回目标空间的地址
2、函数特点
函数有以下两点需要注意:
- strcpy 函数会将源字符串中的 '\0' 拷贝到目标空间
- 目标空间必须足够大,以确保能放下源字符串
3、函数使用
int main() {char src[20] = { 'h','e', 'l', 'l', 'o', '\0','a','b','c' };char dst[20];strcpy(dst, src);return 0;
}
这也从侧面证实了,strcpy 遇到'\0' 会停止拷贝,但是会把'\0'拷贝到目标空间。
三、strcmp函数
strcmp 函数可以比较两个字符串的大小。本质上是逐字节比较,即便是比较汉字,一个汉字占2个字节,也是先将汉字存到内存,然后逐字节比较。
函数声明如下:
1、参数返回值解析
参数介绍:输入的是需要用来比较的两个参数,可以是数组首元素地址,也可以是字符串首元素地址。
返回值:
- 左边 > 右边,返回大于0的数字(不一定返回的就是1)
- 左边 = 右边,返回0
- 左边 < 右边,返回小于0的数字(不一定返回的就是-1)
2、函数特点
这里需要注意strcmp 什么时候会停止比较:
(1) 两者之一遇到 '\0'
两个字符串只要其中一个先遇到 '\0',后面就停止比较,此时会让 '\0' 参与比较
int main() {char* str1 = "ab";char* str2 = "abcd";int ret = strcmp(str1, str2);printf("比较结果为: %d\n", ret);return 0;
}
str1先遇到'\0',此时会把 '\0' 和 'c' 比较,结果是 ‘c’ 更大,所以返回结果是 -1
(2) 在遇到'\0' 之前就分出大小
int main() {char* str1 = "abdd";char* str2 = "abcd";int ret = strcmp(str1, str2);printf("比较结果为: %d\n", ret);return 0;
}
两个字符串比较到第2个位置的时候,'d' 因为大于 'c',所以结果是str1更大,返回结果为1
四、strerror 函数
strerror 函数获取 系统错误码对应的错误信息。当调用库函数出错的时候,错误码会存在变量errno 中,要使用该变量需引入errno.h 头文件。
1、参数返回值解析
第一个参数:错误码errno
返回值:返回 系统错误码对应的错误信息
2、函数使用
int main() {FILE* fd = fopen("a.txt", "r");if (fd == NULL){printf("错误信息为: %s\n", strerror(errno));return -1;}return 0;
}
因为a.txt 不存在,所以这里肯定会打开失败。其实C还给我们提供了一个更直接的函数 perror,使用这个函数可以直接打印错误提示信息。
字符函数(strlen、strcpy、strcmp、strerror)相关推荐
- C语言库函数的实现(strlen strcpy strcmp strcat strstr)
库函数的实现 strlen strcpy strcmp strcat strstr assert函数 头文件:assert.h 又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的 ...
- 字符串函数实现(strlen,strcpy,strcmp,strcat,strrev)
声明:以下代码可能并非最佳方法,若有错误疑问欢迎提出!!! strlen函数 #include<stdio.h> #include<string.h>int mylen(cha ...
- 《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()
在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度.拷贝字符串.比较字符串等:当然现在的C库中为我们提供了很多字符串处理函数.熟练的运用这些函数,可以减少编程工作量,这里介绍几 ...
- 字符串函数中的求长度、查找、分割和错误报告函数(strlen,strstr,strtok,strerror)
文章目录 一.strlen - 求字符串长度 1.函数介绍 2.模拟实现(三种方式) 二.strstr - 字符串查找 1.函数介绍 2.模拟实现 三.strtok - 字符串分割 四.strerro ...
- strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat
写在前面:本文比较长,覆盖了c语言中较多的字符串函数,作者会先带各位了解标准库对函数的介绍,然后模拟实现相关功能. strlen 求字符串长度 size_t表明返回一个无符号类型的数字,是因为考虑到l ...
- strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现
- 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat
用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...
- C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)
参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...
- C语言常用字符串函数strlen、strcpy、strcat、strcmp、strchr
C语言常用字符串函数,求串长strlen(char *s).串复制strcpy(char *s1,char *s2).串连接strcat(char *s1,char *s2).串比较strcmp(ch ...
最新文章
- 阿里动物园再添新丁,小蛮驴搞定物流最后三公里
- 解决 win10+pycharm 环境 Matplotlib图表不能在Pycharm中显示的等问题
- 。net面试题(2)
- linux 内核模块开发,Linux内核模块开发(笔记)
- 真人秀制作网站_真人秀正在毁掉中国的明星
- 国寿鸿寿年金保险(分红型)
- 基于OpenCV及Python的数独问题识别与求解(一)图像预处理
- 关于JavaScript面向对象
- ax200 兼容性问题 老路由器_我的华硕AX89X 160频宽和MU-MIMO问题,小米10测速-路由器交流...
- Vue 实现下拉加载更多
- buct oj 最大公共子序列问题
- mysql时间段重叠_MySQL - 如何选择'DISTINCT'重叠时段(日期或数字范围)
- suptitle()--matplotlib
- 申请公网ip后,配置光猫,路由器使用公网ip步骤
- 移动端 简易的table表格
- LIBSVM实验-在matlab中使用heart_scale数据集
- 苹果4s怎么越狱教程_苹果手机:iOS12怎么降级iOS12一键刷机降级教程
- 【Rust 笔记】09-特型与泛型
- PyQt5学习(7):打印Qprinter
- oracle到神通,我的ORACLE笔记(三)
热门文章
- 使用Qt打造属于自己的串口调试助手
- TLB中ASID和nG bit的关系
- python 指纹_详解Python3之数据指纹MD5校验与对比
- 【python解决SQLAlchemy+MySQL插入数据时报警告Warning: (1366, “Incorrect string value: ‘\\xD6\\xD0\\xB9\\xFA\\xB】
- 现代密码学:信息安全基础
- 计算机毕业设计SSM大学生学习交友平台【附源码数据库】
- 基于python编码实现多智能体进化算法求解带硬时间窗约束的VRP问题(适配版)
- BOOTMGR is missing错误提示解决方法
- 在Carla中加入可以使用的自己的车
- 【SAP】财务专用客户和财务专用供应商