字符串函数
cplusplus.com/reference/cstring/
更多没有总结到的函数大家可以自行查阅
这篇文章只是把最需要知道的函数做一个总结
strlen
size_t strlen ( const char * str );
- 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
- 参数指向的字符串必须要以 ‘\0’ 结束。
- 注意函数的返回值为size_t,是无符号的
- 学会strlen函数的模拟实现
#include <stdio.h>
int main()
{const char*str1 = "abcdef";const char*str2 = "bbb";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}
大家思考一下,这个程序的运行结果是什么?
因为返回的是无符号整型,那么怎么能出来负数呢?
一定要会模拟这个函数
int my_strlen(const char * str)
{int count = 0;while(*str)//"\0"即为0,假{count++;str++;}return count;
}
strcpy
char* strcpy(char * destination, const char * source );
- 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
- 学会模拟实现。
strcat
字符串追加
- 源字符串必须以 ‘\0’ 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 字符串自己给自己追加,可以吗?
当然是不可以的,字符串内容被修改,无法找到\0,程序会死循环
strcmp
int strcmp ( const char * str1, const char * str2 );
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
长度受限制字符串函数
- 相对更加安全
- strncpy
- strncat
- strncmp
可以减小我们程序出现问题的可能,大家有兴趣可以下去查一下
这些函数我们最好也尝试自己去实现
strncpy
cplusplus.com/reference/cstring/strncpy/
strncat
cplusplus.com/reference/cstring/strncat/
strncmp
cplusplus.com/reference/cstring/strncmp/
strstr(查找子串)
const char * strstr ( const char * str1, const char * str2 ); char * strstr (char * str1, const char * str2 );
查找str1中是否有str2的字串
找到时返回char*指针,指向字串头指针
找不到是返回空指针
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");strncpy (pch,"sample",6);puts (str);return 0;
}
需要学会实现
这个函数在数据结构中好像有过讲解,以后会写文章详细讲解
strtok(字符串切割)
char * strtok ( char * str, const char * sep );
str
:要分割的字符串,第一次调用时传入需要分割的字符串,后续调用时传入 NULL。delim
:分隔符,即根据此字符集中的任何字符进行分割。
返回值
- 如果成功找到了分割后的片段,则返回指向该片段的指针。
- 如果找不到分隔符或者传入的字符串为空,则返回 NULL。
注意
- 在第一次调用
strtok
时,需要传入要分割的字符串,并且在后续调用中传入 NULL。 strtok
函数使用静态变量来保存上一次分割的位置,因此不是线程安全的,应当避免在多线程环境下使用。- 分割后的片段会修改原始字符串,将分隔符替换为 NULL,因此在使用返回的片段时要注意不要修改原始字符串。
- 如果要分割多个字符串,建议使用
strtok_r
函数,它是strtok
的线程安全版本。
可以看一下演示
#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello,world,this,is,a,test";char *token = strtok(str, ",");while (token != NULL) {printf("%s\n", token);token = strtok(NULL, ",");}return 0;
}
以上示例将会输出:
Hello
world
this
is
a
test
这里将字符串按照逗号分割成了多个片段,并依次输出每个片段。
奇奇怪怪的函数
strerror
这个函数就比较有意思了
char * strerror ( int errnum );
返回错误码,所对应的错误信息。
/* strerror example : error list */
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{FILE * pFile;pFile = fopen ("unexist.ent","r");if (pFile == NULL)printf ("Error opening file unexist.ent: %s\n",strerror(errno));//errno: Last error numberreturn 0;
}
Edit & Run
这个函数是什么意思呢,在C语言的函数库中,函数执行出现异常会自动返回错误码,而这个错误码会自动存储在全局变量
errno
这个变量中,这个变量是C语言自动创建的,而strerror就可以去解读这个错误码
帮我们找到程序异常发生的原因
字符分类函数:
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’ |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母af,大写字母AF |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母az或AZ |
isalnum | 字母或者数字,az,AZ,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
- isspace需要注意一下,不仅仅是空白字符,有一些转义字符也被认为是空白的
字符转换函数:
int tolower ( int c );
int toupper ( int c );
- 大写变小写或者小写变大写
- 如果不是字母则不动
/* isupper example */
#include <stdio.h>
#include <ctype.h>
int main ()
{int i=0;char str[]="Test String.\n";char c;while (str[i]){c=str[i];if (isupper(c)) c=tolower(c);putchar (c);i++;}return 0;
}