2.8 strstr函数
char * strstr ( const char *str1, const char * str2);
函数功能:
- 在str1字符串中查找str2是否存在,存在则返回str2在str1中的起始地址,若不存在则返回空指针。
使用案例:
#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; }
strstr函数的模拟实现:
char* my_strstr(const char* str1,const char* str2) { if (!*str2) return ((char*)str1); char* cp = str1; char* s1 = str1; char* s2 = str2; while (*cp) { s1 = cp; s2 = str2; while ((*s1 == *s2) && *s2 && *s1) { s1++; s2++; } if (*s2 == '\0') { return cp; } cp++; } return NULL; } int main() { char str1[] = "illoveyou"; char str2[] = "love"; char* pch; pch = my_strstr(str1,str2); printf("%s", pch); return 0; }
cp指针用于记录str1字符串中开始匹配的位置,而s1,s2指针负责移动,并且观测所指向的字符是否相同,cp指针的起始位置不能为 '\0',s2字符串匹配到了 '\0'则说明str1中是包含str2字符串的。strstr函数的模拟实现较为复杂,建议小伙伴们自己多模拟几次。
2.9 strtok函数
char * strtok ( char * str, const char * sep );
函数功能:sep指向存储分隔符的数组。str是待分割的数组,函数每执行一次,就会将str字符串的一个字符串置为 '\0'并返回第一段字符串的首地址。例如:
int main() { char arr[] = "nihao@world.net"; char sep[] = "@"; char* ret = strtok(arr, sep); printf("%s", ret); return 0; }
函数要求:
- sep参数是个字符串,定义了用作分隔符的字符集合。
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。
- 若strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回NULL 指针。
注意:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
使用案例:
int main() { char arr1[] = "nihao@111#222.333"; char arr2[20] = { 0 }; strcpy(arr2, arr1); char sep[] = "@.#"; char* ret = NULL; for (ret = strtok(arr2, sep); ret != NULL; ret = strtok(NULL, sep)) { printf("%s\n", ret); } return 0; }
2.10 strerror函数
char * strerror ( int errnum );
strerror函数的参数是一个错误码,函数接收了一个错误码之后会返回一个char*类型的参数,这个参数指向该错误码所对应的错误信息,我们可以通过打印这个函数的返回值来获取具体的错误信息。库函数在调用过程中如果出错了,会将错误码复制给errno这个变量,errno这个变量是C语言自己提供的一个全局变量,专门用于存放库函数的错误码。
我们可以通过strerror函数来查看1-9错误码分别代表哪些错误信息:
int main() { for (int i = 0; i < 10; i++) { printf("%d:%s\n", i,strerror(i)); } return 0; }
使用案例:例如这里文件如果打开失败了,errno这个变量就会保存文件打开失败所对应的错误码,再通过strerror这个函数将对应的错误信息翻译出来并打印。
int main() { FILE* pFile; pFile = fopen("unexist.ent", "r"); if (pFile == NULL) printf("Error opening file unexist.ent: %s\n", strerror(errno)); return 0; }
由上可知,strerror只是返回错误信息字符的首地址,我们想要将其显示在屏幕上还需要调用printf函数,另一个函数可以同时实现这两个功能。那就是perror函数。
perror函数的使用案例:perror函数的参数是一个供打印的字符串,即:perror函数的参数也是会被打印出来的,可以对perror传入提示型的字符串。
int main() { FILE* pFile; pFile = fopen("unexist.ent", "r"); if (pFile == NULL) perror("FILE:"); return 0; }
3.字符转换函数
常用的字符串函数已经介绍的差不多了。接下来就来看看字符转换函数吧。字符转换函数有两个:
- int tolower ( int c );//将c所对应的字母转化成小写,原本就是小写则保持不变
- int toupper ( int c );//将c所对应的字母转化成大写,原本就是大写则保持不变
注意:
- 这两个函数的参数必须是字母才有效。
- 要包含 ctype.h头文件。
使用案例:
#include <stdio.h> #include <ctype.h> int main() { int i = 0; char str[] = "Test String.\n"; char c; while (str[i]) { c = str[i]; c = tolower(c); putchar(c); i++; } return 0; }
4.完结
本章的内容就到这里啦,若有不足,欢迎评论区指正,下期见!