目录
一:长度不受限制的字符串函数
1.strlen
- 首先给出在VS编译器下strlen函数的声明
- size_t strlen(const char* str);
- 这里的strlen 函数的返回类型size_t,
- 是VS里面自定义的一种类型,和unsigned int 相同
- 故strlen最终会返回一个无符号整型,代表所求字符串的大小
- 参数为一个char *类型的指针,(*str)整体被const修饰是为了防止指针str指向的内容即(*str)被修改
- 作用:用来求出一个字符串的长度,不包括‘\0’
- 简单例子:
本章中所有的字符串函数都需要先引用头文件<string.h>
2.strcpy
-
chat * strcpy(char * destination,const char * source)
-
返回类型为char *,即字符指针,返回的是destination的地址
-
参数为两个char *类型的指针,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于拷贝的字符串的首地址,为了防止source指向的内容被修改,故用const 修饰,而destination指向的内容要被修改,不加const(下文中有关const的部分不再强调)
-
注意点:
-
1:源字符串必须以‘\0’结束
-
2:会将源字符串中的‘\0’拷贝到目标空间中
-
3:目标空间必须足够大,确保能够存放源字符串
-
作用:将一个字符串b的内容复制到另一个字符串a中,a中内容会被修改
-
简单例子:
-
-
源字符串不以‘\0’带来的问题:
-
strcpy不知何时结束,会引发异常
3.strcat
- chat * strcat(char * destination,const char * source)
- 返回类型为char *,即字符指针,返回的是destination的地址
- 参数为两个char *类型的指针,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于追加的字符串的首地址
- 注意点:
- 1:源字符串必须以‘\0’结束
- 2:会将源字符串中的‘\0’也追加到目标空间中
- 3:目标空间必须足够大并且可以被修改,确保能够追加源字符串
- 4:不能自我追加
- 作用:将一个字符串b的内容追加到另一个字符串a中,a中内容会被修改
- 简单例子:
- 自我追加不可行,但是用后面提及的strncat可以
4.strcmp
int strcmp(const char * str1,const char *str2)
- 返回类型为int
- 如果str1>str2,返回大于0的数字
- 如果str1=str2,返回等于0的数字
- 如果str1<str2,返回小于0的数字
- 或许你会疑惑两个字符串为什么不能用>,<,==来比较
- 仔细想想,字符串名代表首元素的地址,你直接写if(str1<str2)是没有意义的
- 这比较的是两个地址的大小,而地址是内存随机分配的,它们的大小都不是确定的
- 参数为两个char *类型的指针,str1用于接收字符串1的首地址,str2字符串2的首地址
- 究竟是如何比较的呢?
- 是把字符串中的字符一个个比较它们的ASCALL码值,相等就比较下一个字符,不相等直接返回大于0或小于0,每个字符都相等才返回0
- 作用:比较两个字符串的大小
- 简单例子:
- 字符‘W’的ASCALL码值大于字符‘C’的ASCALL码值,返回大于0的数字1
二:长度受限制的字符串函数
1.strncpy
- chat * strncpy(char * destination,const char * source,size_t num)
- 返回类型为char *,即字符指针,返回的是destination的地址
- 参数为两个char *类型的指针和一个无符号整型,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于拷贝的字符串的首地址,num用于接收要拷贝的字符的个数
- 作用:将一个字符串b的中num个字符复制到另一个字符串a中,a中内容会被修改
- 优点:能控制复制字符的个数,更加安全
- 简单例子:
2.strncat
- chat * strncat(char * destination,const char * source,size_t num)
- 返回类型为char *,即字符指针,返回的是destination的地址
- 参数为两个char *类型的指针和一个无符号整型,destination用于接收接下来要被覆盖的字符串的首地址,source用于接收用于追加的字符串的首地址,num用来决定追加几个字符
-可以实现自我追加 - 作用:将一个字符串b中num个字符追加到另一个字符串a中,a中内容会被修改
- 简单例子:
3.strncmp
int strncmp(const char * str1,const char *str2,size_t num)
- 返回类型为int
- 参数为两个char *类型的指针,str1用于接收字符串1的首地址,str2字符串2的首地址
- num决定比较前num个字符
- 是把字符串中的字符一个个比较它们的ASCALL码值,相等就比较下一个字符,不相等直接返回大于0或小于0,每个字符都相等才返回0
- 作用:比较两个字符串前num个字符的大小
- 简单例子:
- 可以看到,比较前6个字符时,两个串因为前6个字符相同,返回0
- 而比较前7个字符时,由于a字符串第七个字符‘W’的ASCALL码 >b字符串的第七个字符’C’的ACSALL码,故返回大于0的数字1
三:字符串查找函数strstr
char* strstr(const char * str1,const char *str2)
- 返回类型为char*,在 str1中查找str2,若str2在str1中,则返回str2的首元素在str1中的地址
- 比如str1=“abbbd”,str2=“bd”,会返回str1中第四个元素b的地址
- 若str2不在str1中,则返回空指针NULL
- 简单例子:
- 可以看到,c 的地址和a[3]的地址相同,字符串d不在字符串a中,返回空指针
四:分割字符串函数strtok
- char * strtok(char * str,const char * sep)
- 这是一个比较奇特的函数,使用的场景也较少
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
- 是不是感觉上面说的不是人话?看个例子应该能帮助你理解
- 总结:第一次传参是传入要分割的字符串,之后通通传入空指针即可
- 你是不是觉得这样子使用很麻烦,我们可以用一个循环搞定它
- 初始化只有一次,我们需要传字符串a也只有一次,可以把ret=strtok(a,p)放在初始化条件上
- 之后每次循环都传的是空指针NULL,故在3处写成ret=(NULL,p)一直循环
- 当ret的返回值不是NULL时说明还没分割完,故循环条件为ret!=NULL
五:打印错误信息函数strerror
- char *strerror(int errnum)
- 返回值是一个指针变量char*
- C语言中回根据参数errnum 不同的值返回不同的地址
- 指向了不同的字符串,也就是不同的错误信息
- 实际中的应用:
- 其中errno为全局错误码,需要引用头文件<errno.h>,当我们打开一个不存在的文件时,发生了错误,全局错误码的值会自动被修改。
- 我们只需要打印出来查看是什么错误即可。