C语言两种方法判别指定字符串是否被另一字符串包含

一、方案一

1、代码
/* 
     程序目的:
        判断指定字符串是否包含在另一个字符串中
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int is_in(char *wenben, char *search_word);
int find(char *buf, char *sub);
int main()
{

    // 调用函数一
    if (is_in("机房机房就感觉贾继康", "贾继康") == 1) // 调用函数:参数二:比较文本,参数一:原文本
    {
        printf("\n包含");
    }
    else
    {
        printf("\n不包含");
    }
}

// 创建函数(方法一):是否包含字符串函数
int is_in(char *wenben, char *search_word)
{
    int i = 0, j = 0, flag = -1;
    while (i < strlen(wenben) && j < strlen(search_word))
    {
        if (wenben[i] == search_word[j])
        { //如果字符相同则两个字符都增加
            i++;
            j++;
        }
        else
        {
            i = i - j + 1; //主串字符回到比较最开始比较的后一个字符
            j = 0;         //字串字符重新开始
        }
        if (j == strlen(search_word))
        {             //如果匹配成功
            flag = 1; //字串出现
            break;
        }
    }
    return flag;
}
2、结果

在这里插入图片描述

二、方案二

1、代码
/* 
     程序目的:
        判断指定字符串是否包含在另一个字符串中
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int is_in(char *wenben, char *search_word);
int find(char *buf, char *sub);
int main()
{
 
    // 调用函数二
    char buf[] = "贾继康几点服";
    if (find(buf, "贾继康") == 1)
        printf("\n是子串");
    else
        printf("\n不是子串");

    system("pause");
}

// 创建函数(方法二):是否包含字符串函数
int find(char *buf, char *sub) // 参数一:主文本,参数二:待查词
{
    int len = strlen(buf);                 // 主文本长度
    char *p = (char *)malloc(len * 2 + 1); // 动态内存分配

    memset(p, 0x00, len * 2 + 1); // 0x00:0---》 p:指针或者数组,0x00:赋给p的值 p的长度
    strcpy(p, buf);               // 将buf复制到P中
    strcat(p, buf);               //把buf所指字符串添加到p结尾处(覆盖p结尾处的'\0')并添加'\0'。返回指向p的指针。

    if (strstr(p, sub) == NULL)
    { //在字符串p中查找第一次出现字符串sub的位置,不包含终止符 '\0'。
        return 0;
    }
    else
    {
        return 1;
    }
}
2、结果

在这里插入图片描述

三、方案三

1、代码
/* 
     程序功能:
            1: 判断原字符串是否包含指定字符串
            2: 返回第一次包含出现的位置

 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int find(char *source, char *target);
int main()
{

    // 调用函数二
    char buf[] = "贾继康测试贾继康"; //  
    char buf2[] = "贾继康测试贾继康";
    char buf3[] = "继康"; //  
    char *p = buf;
    char *p2 = buf3;

    // printf("数组所占空间大小:%d\n", sizeof(buf2));
    // printf("%c",*(p+3));
    if (find(buf, buf3) == 1)
    {
        printf("有");
    }
    else
    {
        printf("无");
    }
}

// 创建函数
// source为源字符串,target为子字符串,如找到则返回在源串中的位置,
//如未找到则返回-1,如果要改为找到返回1,把return i改为return 1;
int find(char *source, char *target)
{
    int i, j;//原字符和目标字符位置
    int s_len = strlen(source); // 原字符串长度
    int t_len = strlen(target); //  目标字符串长度
    int weizhi = 0;

    /* if (t_len > s_len) // 目标字符串长度< 原字符串长度
    {
        return -1;
    } */

    for (i = 0; i <= s_len; i++)
    {
        j = 0;
        int flag = 1;
        // 从i=0,j=0 开始
        if (source[i] == target[j]) // 待查字符与原字符中的字符相等时
        {   
            int k, p = i;               // 这里将p=i:获取目标字符当前的位置
            weizhi++;//位置
            for (k = 0; k < t_len; k++) // 以目标字符串作为遍历次数。进一步遍历原字符
            {
                if (source[p] == target[j]) // 继续相同
                {
                    p++;// 相同位置上:继续前移
                    j++;
                    continue;
                }
                else
                {
                    flag = 0;
                    break;
                }
                //printf("第一次当前%d");
            }
        } // 当source[i] == target[j]对应位置的字符不相等
        else
        {
            continue; // 下一个
        }
        //printf("位置%d\n",weizhi);

        if (flag == 1)
        {
            printf("此时原字符串指针i的位置 %d\n", i);
            printf("此时比较字符串指针j的位置 %d\n",j);
            printf("比较字符串在原字符串中第一次出现的位置 %d\n\n", i-strlen(target)+2);// i-strlen(c)+2
            return 1;  
        }
    }
    return -1;
}

2、结果

在这里插入图片描述

四、参考链接

1、https://blog.csdn.net/kkwant/article/details/81133814
2、https://blog.csdn.net/meiqi0538/article/details/83819727

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐