strstr函数和strtok函数

文章目录

  • strstr函数
  • 函数使用
  • 函数模拟实现
  • strtok函数

strstr函数

strstr函数和strtok函数_第1张图片
参数为两个字符串的地址,在str1中找str2不包括结束符。

函数使用


#include
#include

int main()
{
	
	char* str1 = "abcdeffgmnlo";
	char* str2 = "de";
	char str3[] = "fg";
	char* pc1 = strstr(str1, str2);
	printf("%s\n", pc1);
	char* pc2 = strstr(str1, str3);
	printf("%s\n", pc2);
	char* pc3 = strstr(str1, "mmm");
	printf("%s\n", pc3);
	return 0;
}

在这里插入图片描述
函数返回值为在主串中找到的子串首元素地址
打印时以这个地址开始打印找到结束字符停止打印

函数模拟实现

#include
#include

const char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return str1;
	}
	const char* cp1 = NULL;
	const char* cp2 = NULL;
	const char* pmove = str1;
	while (pmove != '\0')
	{
		cp1 = pmove;
		cp2 = str2;
		while (*cp1 == *cp2 && *cp1 != '\0' && *cp2 != '\0')
		{
			cp1++;
			cp2++;
		}
		if (*cp2 == '\0')
		{
			return pmove;
		}
		pmove++;
	}
	return NULL;
}


int main()
{
	char* str1 = "abcddefg";
	char* str2 = "de";
	char* ret = my_strstr(str1, str2);
	if (ret == NULL)
	{
		printf("找不到");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

这个函数的模拟实现可以很好的锻炼你的思维,多想多上手。

strtok函数

作用:将一个字符串分割成多个字符串
strstr函数和strtok函数_第2张图片
strstr函数和strtok函数_第3张图片

#include 
#include 

int main()
{
	char arr[] = "[email protected]";
	char* p = "@.";
	char buf[20] = { 0 };
	strcpy(buf, arr);
	char* ret = strtok(buf, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	return 0;
}

在这里插入图片描述
这里的@和.为分隔符,在调用strtok函数时会把这两个分隔符转换为‘\0’,并返回分隔符之前的字符串首地址,在第二次调用时要传空指针过去,才能返回第二个字符串的首地址,这里为什么要把arr赋给buf这个新数组?因为strtok调用后会改变原字符串。如果字符串中不存在更多的标记,则返回 NULL 指针。
代码改进:

#include 
#include 

int main()
{
	char arr[] = "[email protected]";
	char* p = "@.";
	char buf[20] = { 0 };
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL;ret = strtok(NULL,p))
	{
		printf("%s\n", ret);
	}
	
	return 0;
}

你可能感兴趣的:(C,c语言)