目录
一、strstr的使用和模拟实现
1.strstr的介绍
这个函数有两个参数,str1和str2,函数返回字符串str2在字符串str1中第一次出现的位置,下面通过一个例子来看:
2.strstr的模拟实现
思路:我们需要依次比较两个字符串,直到找到str1中与str2中第一个字符相同时,然后再依次让指向两个字符串的指针往后走,直到遇到str2的\0时都相等,说明找到了,就是之前那个位置,由于往后走的过程中,我们无法再找到str1中与str2中第一个字符相同时的位置,所以我们在找到的同时需要用另外一个指针来存储位置并作为返回值,若在找的途中遇到不满足条件的或者没有相同的,则返回NULL。
代码如下:
char* my_strstr(const char* str1, const char* str2)
{
const char* cur = str1; //const保证其不被修改
const char* s1 = NULL;
const char* s2 = NULL;
assert(str1 && str2); //两个字符串不为空
if (*str2 == '\0') //若str2只有\0,直接返回
{
return (char*)str1; //强制类型转化
}
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)cur;
cur++;
}
return NULL;
}
二、strtok函数的介绍
⭐strtok也有两个参数,第一个参数是含有0或多个分隔符(例如@、.等)的字符串,第二个参数则是储存这些分隔符的。
⭐strtok函数找到str中所含有的一个分隔符,会将其改成\0,并返回一个指向这个分隔符的指针。(注意:strtok会改变被操作的字符,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且是可修改的)
⭐strtok函数的第一个参数不为NULL时,函数将找到str中第一个标记,会保存它在字符串中的位置。
⭐strtok函数第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个分隔符。
⭐如果字符串中不存在更多的分隔符,则返回NULL。
简单来说,就是将字符分割,例如"zhangsan@12345.com",我们希望通过该函数得到"zhangsan"、"12345"、"com"。
通过上面的例子,可以看到,strtok找到一个分隔符就返回了,当含有多个不连续的分隔符时,我们按照上面的方法写就太冗长了,可以用for循环来写,因为第一个表达式只执行依次。
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "zhangsan@12345.com";
char str2[30] = { 0 };
strcpy(str2, str); //复制到str2,以便不改变str
char* p = "@.";
char* s = NULL;
for (s = strtok(str2, p); s != NULL; s = strtok(NULL, p))
{
printf("%s\n", s);
}
return 0;
}
三、strerror函数的介绍
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在errno.h这个头文件中说明的,C语言程序启动的时候就会使用一个全局变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会有对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的,strerror函数就可以将错误对应的错误信息字符串的地址返回。
例如,可以看一下0~10对应的错误信息:
再举个例子看一下用法:
于此,这三个字符串函数的简单介绍就结束啦!