【C】判断子字符串是否包含原字符串中(且返回子字符串在原字符串中出现的位置)

版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/84730086

判断子字符串是否包含在原字符串中(且返回子字符串在原字符串中出现的位置)
一、说明

       此篇博文算是针对于是否包含字符串的加强版。
       判断子字符串是否实包含原字符串中可以参考:此篇博文

二、分析
 测试比较字符串位置
     
   说明:
      i:当前原字符串指针的位置
      j:当前比较字符串指针的位置
      weizhi:比较字符串第n次出现在原字符串的位置
      一个中文字符占两个字节
       
      第一种:
      原字符串:贾房贾测贾
      比较字符串:贾

   原字符串                     比较字符串                   比较字符串第n次出现在原字符串的位置
   i=2                             j=2                                weizhi=2
   i=6                             j=2                                weizhi=6
   i=10                            j=2                                weizhi=10
      第二种:
      原字符串:贾继康房贾继康测贾继康
      比较字符串:贾继康
    
   原字符串                     比较字符串                   比较字符串第n次出现在原字符串的位置
      i=6                             j=6                                weizhi=2 
      i=14                            j=6                                weizhi=10 
      i=22                            j=6                                weizhi=18

      第三种:
      原字符串:测试贾继康房贾继康测贾继康侧设计费
      比较字符串:贾继
    
   原字符串                     比较字符串                   比较字符串第n次出现在原字符串的位置
      i=8                          j=4                                weizhi=6 
      i=16                         j=4                                weizhi=14 
      i=24                         j=4                                weizhi=22
三、代码
/* 
     程序功能:
            1:判断子字符串是否实现在原字符串中
            2:且返回出现在原字符串所在的位置


 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//int is_in(char s, char c);
int is_in(char *s, char *c, int location[]);
int main()
{
    char str[100] = "测试贾继康房贾继康测贾继康侧设计费";
    char str1[100] = "贾继康";

    //int *location = (int *)malloc(n * sizeof(int));
    int loc[250] = {0};
    int *location = loc;

    if (is_in(str, str1, location) == 1)
    {
        printf("原文件包含比较字符串\n");
        for (int i = 0; i < sizeof(location); i++)
        {
            if (location[i] != 0) //待查字符串在原字符串中不为空
            {
                printf("所在的位置:%d\n", location[i]);
            }
        }
    }
    else
    {
        printf("原文件不包含指定字符串\n");
    }
}

// 子函数
int is_in(char *s, char *c, int location[])
{
    int i = 0, j = 0, flag = -1;
    int firstW = 0;
    int num = 0;
    while (i < strlen(s) && j < strlen(c)) // s:原字符串,c: 比较字符串
    {
        if (s[i] == c[j]) // 指针所指位置的字符
        {                 //如果字符相同则两个字符都增加
            i++;
            j++;
        }
        else
        {
            i = i - j + 1; //主串字符回到比较 最开始比较的 后一个字符
            j = 0;         //字串字符重新开始
        }

        if (j == strlen(c)) //如果匹配成功
        {
            flag = 1; //字串出现
            //i-strlen(c) 比较字符在原字符串中第一次出现的位置
            printf("此时原字符串指针i的位置 %d\n", i);
            printf("此时比较字符串指针j的位置 %d\n", j);
            printf("比较字符串在原字符串中第一次出现的位置 %d\n\n", i - strlen(c) + 2); // i-strlen(c)+2
            location[num] = i - strlen(c) + 2;
            num++;
            j = 0;
            continue;
            /* if (s[i] == '\0' || s[i] == '\n')
            {
                printf("结束\n");
                break;
            } */
            //return i-strlen(c)+2;
            //break; // 第一次出现了不能结束
        }
    }

    return flag;
    //return i-strlen(c) +2;
}
四、结果

在这里插入图片描述

五、补充

      目的:int型数字转换为char型字符串
      分析:
            1、将所有的int型数字通过拼接,形成int型数组
            2、再将int型数组转化为char型字符串

猜你喜欢

转载自blog.csdn.net/Jiajikang_jjk/article/details/84730086