目录
前言:
函数简介:
求字符串长度:
strlen - 求字符串长度
长度不受限制的字符串函数:
strcpy - 字符串拷贝
strcmp - 字符串比较
strcat - 字符串追加
长度受限制的字符串函数(参数组成记住 下下篇要考):
strncpy
strncmp
strncat
查找字符串函数:
strstr - 查找字符串
strtok - 分隔字符串
错误信息报告:
strerror - 字符串报错函数
字符分类函数
字符转换函数
呐呐呐~下面就要正式介绍每个字符串函数:
(看似好几个 实则极其相似且易理解)
详解字符串函数:
strlen:(string length)(字符串 长度)
size_t strlen ( const char * str );
这个是平时较为常用的字符串函数 ,想必大家都不陌生吧。那就不讲了...
有一些值得注意的点 :
1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
含 '\0' )。
2.参数指向的字符串必须要以 '\0' 结束。
3.注意函数的返回值为size_t,是无符号的( 易错 )
4.学会strlen函数的模拟实现(三种)(下篇会详细介绍)
关于第三点 我们这里举个栗子:
如果函数返回值是有符号整形的话 那么这里(strlen("abc") - strlen("abcdef")得到的值就是-3
很明显结果是小于0的 然而结果呢(bushi);
strcpy:(string copy)(字符串 拷贝)
这个函数简述就是从源字符串拷贝到目标字符串中 包括\0
char* strcpy(char * destination, const char * source );
strcpy的特点
1.会将源字符串的\0拷入
2.strcpy使用时 源字符串中必须以'\0'结束
3.目标字符串的空间足够大 以确保能够存下源字符串
4.目标空间必须可变
下面是针对各个特点的测试用例与测试结果
strcmp:(string compare)(字符串 比较)
这个函数简述就是挨个比较对应元素的ascii码值直到\0 不相等就返回二者相减的值
int strcmp(char* destination, const char* source);
这里值得介绍的是C语言的标准 :
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
再有就是在进行字符串比较时 比较的是对应位置的ASII码值的大小而非字符串长度如"abcde"和"abq"
strcat:(string catenate)(字符串 链接)
这个函数简述就是从将源字符串的元素追加到目标字符串后 包括\0
而开始追加的位置是目标字符串的\0处
char * strcat ( char * destination, const char * source );
1.源里面的\0决定什么时候结束 目标里的\0决定从哪追加
2.源字符串必须以\0结束
3.目标空间必须足够大
4.目标空间必须可修改
其中3.4不再赘述 无论是因数组大小发生越界访问还是修改常量字符串都会出现问题。
我们重点说下1.2
由输出结果可知 开始追加的位置是在目标字符串的\0位置 而后源字符串的\0也一并追加过去(否则后面还会有xxxx)
无论目标字符串还是源字符串都要有\0 否则会出现不知从何处追加或不知从何处结束的问题
OKOK接下来我们迎来了上述函数的好兄弟们,"strncpy"、"strncmp"、"strncat"
他们与"strcpy"、"strcmp"、"strcat"类似 唯一区别是什么 ? 'n'
我们就可以想想 这里n指的是什么 ?
noodle?哦 别傻了 你才是noodle
这里的n 指的是number
而实际情况确实也如表面那样 他们的区别就是前者限制长度 后者不限
strncpy:
这个函数简述就是拷贝num个字符从源字符串到目标字符串
char * strncpy ( char * destination, const char * source, size_t num );
这里先举个例子 看下具体应用
这里的size_t num是拷贝的字节数
但是值得注意的是 如果出现源字符串中的长度小于num 需要在目标后面追加0 直到num个
strncpy:
这个函数简述就是挨个比较源字符串和目标字符串num个对应字符的ASCII码值 或者比较到其中一个字符串结束
int strncmp ( const char * str1, const char * str2, size_t num );
strncat:
这个函数简述就是将num个源字符串的元素追加到目标字符串之后 包括\0
从\0处开始追加 并且追加完后主动结束
char * strncat ( char * destination, const char * source, size_t num );
同时这个函数可以实现自己给自己追加 也是完全ok的 只要字符数组的空间足够大
你是否还为挨个查找字符串中的子字符串而烦恼
你是否因为字符串中有一些分隔符号却被要求提取出来分隔的各个子串
你是否(mei le)
接下来是字符串查找函数:
strstr:
这个函数简述就是在一个字符串中查找另一个字符串是否存在,如果存在就返回子串的起始地址(第一次出现的位置),如果不存在就返回NULL
char * strstr ( const char *str1, const char * str2);
strtok :(string token)(字符串 标记)
这个函数简述不了 看具体要求(向下)
char * strtok ( char * str, const char * sep );
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。
重量级嘉宾总是压轴的 接下来介绍一位输出错误信息的函数
strerror:(string error)(字符串 错误)
这个函数简述就是接收错误码 然后输出错误码所对应的错误信息
char * strerror ( int errnum );
首先我们要引用errno给我们提供错误码 它的头文件是<errno.h>,他是记录系统最后一次的错误代码 是C语言提供的全局的错误变量
上文中的perror函数和strerror有相似的功能 相当于先打印自定义及:进而输出错误码对应的错误信息
补充:
字符分类函数:
函数 | 如果他的参数符合下列条件就返回真 |
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 );//小写转大写
小结:
本次讲述的字符函数及字符串函数就先到这里 在学习strcmp strcpy strcat函数最好和strncmp strncpy strncat函数对比学习 其他函数要注意参数组成及返回类型。