长度受限制的字符串函数介绍
长度限制也就是说作用于字符串时,可以限制其长度,再任意处停止
strncpy
可以规定拷贝的字符个数,格式如下
char * strncpy ( char * destination, const char * source, size_t num );
说明:
1、拷贝num个字符从源字符串到目标空间。
2、如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
strncat
可以规定追加的长度,格式如下
char * strncat ( char * destination, const char * source, size_t num );
说明:把 source所指向的字符串追加到 destination所指向的字符串的结尾,直到 n 字符长度为止。
strncmp
可以选择所需要比较的长度,格式如下
int strncmp ( const char * str1, const char * str2, size_t num );
说明:比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
字符串查找
strstr
寻找一个字符串中含目标字符串的地址,格式如下
char * strstr ( const char *str1, const char * str2);
说明:
1、函数搜索一个字符串在另一个字符串中的第一次出现。
2、找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;
3、如果未找到所搜索的字符串,则返回NULL
应用如下
1. #include <stdio.h> 2. #include <string.h> 3. main() 4. { 5. char *s="GoldenGlobalView"; 6. char *l="lob"; 7. char *p; 8. p=strstr(s,l); 9. if(p) 10. printf("%s",p); 11. else 12. printf("NotFound!"); 13. return 0; 14. }
模拟实现strstr
char* my_strstr(char *str1, char* str2)
实现strstr我们我们需要对两个字符串进行比较,那么对于str1,我们每次遍历都需要一个起点,而对于str1与str2进行遍历时,我们也各自需要指针进行遍历,逻辑如下
代码实现如下
1. //char* my_strstr(char *str1, char* str2) 2. //{ 3. // char* cp = str1; 4. // char* s1 = cp; 5. // char* s2 = str2; 6. // 7. // if (*str2 == '\0') 8. // return str1; 9. // 10. // while (*cp) 11. // { 12. // //开始匹配 13. // s1 = cp; 14. // s2 = str2; 15. // while (*s1 && *s2 && *s1 == *s2) 16. // { 17. // s1++; 18. // s2++; 19. // } 20. // if (*s2 == '\0') 21. // return cp; 22. // 23. // cp++; 24. // } 25. // 26. // return NULL; 27. //}
strtok
分解字符串为一组字符串。str为要分解的字符,sep为分隔符字符,搭配头文件#include<string.h>使用,格式如下:
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 指针记。
使用如下
1. //int main() 2. //{ 3. // char arr[] = "zpengwei@yeah.net@666#777"; 4. // char copy[30]; 5. // strcpy(copy, arr); 6. // 7. // char sep[] = "@.#"; 8. // char* ret = NULL; 9. // char* ret = strtok(copy, sep); 10. // printf("%s\n", ret); 11. // 12. // ret = strtok(NULL, sep);//在同一个字符串中被保存的位置开始,查找下一个标 13. 记。 14. // printf("%s\n", ret); 15. // 16. // ret = strtok(NULL, sep); 17. // printf("%s\n", ret);
上述代码有很大的局限性,而且使用起来不方便,下面代码博主进行了一些优化,代码如下
1. // char arr[] = "zpengwei@yeah.net@666#777"; 2. // char copy[30]; 3. // strcpy(copy, arr); 4. // 5. // char sep[] = "@.#"; 6. // char* ret = NULL; 7. // 8. // for (ret = strtok(copy, sep); ret != NULL; ret=strtok(NULL, sep))//循环进行 9. // { 10. // printf("%s\n", ret); 11. // }
这样以来就不用管分割几次了,交给循环来实现就好
注意:需要注意的是,使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的str已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误。
错误信息报告
库函数在执行时,发生了错位,就会产生错误码,产生的错误码会存放在errno这个变量中,errno时C语言提供的全局变量
strerror
使用sterror可以对错误码进行一个打印,应用代码如下
1. int main() 2. { 3. int i = 0; 4. for (i = 0; i < 10; i++) 5. { 6. printf("%d: %s\n", i, strerror(i));// 7. } 8. return 0; 9. }
运行结果如下
也可将其应用至文件处,用于找出错误,并指出错误原因,简单运用代码如下
1. //int main() 2. //{ 3. // FILE* pf = fopen("data.txt", "r"); 4. // if (pf == NULL) 5. // { 6. // printf("fopen: %s\n", strerror(errno)); 7. // perror("fopen"); 8. // //fopen: xxxxxx 9. // return 1; 10. // } 11. // fclose(pf); 12. // return 0; 13. //}
字符操作
字符分类函数
函数 |
如果他的参数符合下列条件就返回真 |
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 |
任何可打印字符,包括图形字符和空白字符 |
字符转换
tolower()
tolower()函数是把字符串都转化为小写字母。格式如下
int tolower ( int c );
使用如下
1. string str= "THIS IS A STRING"; 2. for (int i=0; i <str.size(); i++) 3. { 4. str[i] = tolower(str[i]); 5. }
toupper()
toupper()函数是把字符串都转化为大写字母。格式如下
int toupper ( int c );
使用如下
1. string str= "hahahahaha"; 2. for (int i=0; i <str.size(); i++) 3. str[i] = toupper(str[i]); 4.
字符函数与字符串函数至此就讲解完毕了,请关注博主后续对内存函数的讲解。
记得三连哦!!!