文章目录
- strstr函数
- 函数使用
- 函数模拟实现
- strtok函数
strstr函数
参数为两个字符串的地址,在str1中找str2不包括结束符。
函数使用
#include<stdio.h>
#include<string.h>
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<stdio.h>
#include<assert.h>
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函数
作用:将一个字符串分割成多个字符串
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "zhangsan@qq.com";
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 <stdio.h>
#include <string.h>
int main()
{
char arr[] = "zhangsan@qq.com";
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;
}