C库函数 ——strstr、strtok的详解

简介: C库函数 ——strstr、strtok的详解

一、C库函数strstr()

1.函数声明

char * strstr (const char * str1,const char * str2)

char * strstr ( const char * str1,const char * str2),函数的具体功能是在字符串 str1 中查找第一次出现字符串 str2 的位置,不包含终止符 '\0'


2.参数设置

str1: 要被查找的字符串


str2: 在str1中要被搜索的字串


3.返回值

该函数返回在 str1中第一次出现 str2 字符串的位置,如果未找到则返回 NULL 指针


4.函数的使用

#include <stdio.h>
#include <string.h>
int main()
{
     char arr1[20] = "abcdefghi";
     char arr2[10] = "defghi";
    char* ret = strstr(arr1, arr2);
    if(ret == NULL)
        printf("没找到\n");
    else
       printf("%s\n", ret);
   return 0;
}


5.模拟实现strstr函数

5.1思路分析

如果说要在abbbcdef 中查找 bbc,我们首先想到的是,str1指向首字符'a',str2指针指向首字符'b',让str1与str2指针进行比较。首先str1指向的第一个字符,并不一定与str2指向的第一个字符相等,此时我们让str1向后移动,当str1指向的字符正好与str2指针指向的字符一致时,我们再让str1与str2进行两两比较遍历操作。


image.png

image.png

在遍历的过程之中,我们会发现当str1与str2指向的位置不相等时,难道意为着没有找到子串吗?其实不是,此时我们只能说明从绿色箭头开始,我们是不能找到想要的bbc的,但并不是整个str1字符串里是没有的。

image.png

以上没有匹配成功,那怎么办呢?我们就要退回,从绿色箭头的后一个位置(让其绿色指针自增)进行继续匹配,让str2指针也回到指向首字符的位置, 再次进行遍历比较,就找到了我们此时想要的子串。

image.png

此时,我们还需要考虑一个问题,那就是就拿str1指针和str2指针进行操作吗?如果进行操作,我们str1和str2需要回头进行再次操作就不知道在哪个位置了。况且我们需要将 在正确找到第一次出现str2子串的首地址 后进行返回。


所以我们


创建一个s1指针变量在str1字符串中来回移动,


创建一个s2指针变量在str2字符串中来回移动,


创建一个cp指针变量用来记录正确的第一次出现str2子串的首字符位置(绿色箭头)。

image.png

5.2 代码实现

有了以上逻辑分析,我们实现代码起来就很容易了。将代码整理如下:

#include<stdio.h>
#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{
  char* s1 = NULL;
  char* s2 = NULL;
  char* cp = (char* )str1;
  while (*cp)
  {
    s2 = (char*)str2;
    s1 = cp;
    //*s1与*s2不为'\0',且两个指针指向的内容相等时,循环遍历
    while (*s1 && *s2 && *s1 == *s2)
    {
      s1++;
      s2++;
    }
    //说明str2字符串被查找完了,就返回匹配成功的首字符地址(cp)
    if (*s2 == '\0')
    {
      return cp;
    }
    cp++;
  }
  //没找到返回空指针
  return NULL;
}
int main()
{
  char arr1[] = "abbbcdef";
  char arr2[] = "bbc";
  char* ret = my_strstr(arr1, arr2);
  if (ret == NULL)
  {
    printf("没找到\n");
  }
  else
  {
    printf("%s", ret);
  }
  return 0;
}

二、C库函数strtok

1.函数声明

char * strtok ( char * str, const char * sep );


2.规则

sep参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

如果字符串中不存在更多的标记,则返回 NULL 指针

简单理解, 就是 用作切割字符串。参数str为想要分割的字符串,sep为分割符字符串。当strtok()在参数str的字符串中发现到参数sep的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必须给予参数str字符串,往后的调用则将参数str置为NULL, 在下一次调用中将作为起始位置。每次调用成功则返回被分割出片段的指针,否则返回NULL指针。


3.代码使用

#include <stdio.h>
#include <string.h>
int main()
{
    char *p = "123456789@qq.com";
    const char* sep = ".@";
    char arr[30];
    char *str = NULL;
    strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
    for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
    {
    printf("%s\n", str);
    }
}


目录
相关文章
|
3天前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
3天前
|
C语言
深入理解字符串函数(strstr、strtok、strerror)(二)
深入理解字符串函数(strstr、strtok、strerror)(二)
|
10月前
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
26 0
|
8月前
|
编译器 Linux C语言
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
40 0
|
8月前
|
存储 算法 编译器
【C语言】字符串函数介绍三(strstr、strtok、streeror)
【C语言】字符串函数介绍三(strstr、strtok、streeror)
60 0
|
9月前
|
算法 C语言
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
该库函数作用和strcpy很相似,不同点在于
48 0
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现
🐰strlen 🐰模拟strlen 🐰strcpy 🐰模拟strcpy 🐰strcat 🐰模拟strcat 🐰strcmp 🐰模拟strcmp 🐰strncpy 🐰strncat 🐰strncmp 🐰strstr 🐰模拟strstr
|
C语言
c语言 字符串操作函数 strcpy, strcat, strcmp, strlen.
字符串操作函数是用于操作字符串的。有的函数有新版和旧版,大同小异。字符串操作函数的头文件: string.h
81 0
|
C语言
C语言常用字符串函数strlen、strcpy、strcat、strcmp、strchr
C语言常用字符串函数,求串长strlen(char *s)、串复制strcpy(char *s1,char *s2)、串连接strcat(char *s1,char *s2)、串比较strcmp(char *s1,char *s2)、串定位strchar (s,char c)演示、解析
147 0
C语言常用字符串函数strlen、strcpy、strcat、strcmp、strchr