如何在C语言中判断字符串是否包含子串

一、使用strstr函数进行判断

#include<stdio.h>
#include<string.h>

int main()
{
    char str1[50],str2[50];
    printf("请输入字符串1:\n");
    scanf("%s",str1);
    printf("请输入字符串2:\n");
    scanf("%s",str2);
    if(strstr(str1,str2)!=NULL)
        printf("字符串2是字符串1的子串\n");
    else
        printf("字符串2不是字符串1的子串\n");
    return 0;
}

在C语言中,可以使用strstr函数来判断一个字符串是否包含另一个字符串。strstr函数的使用方法为:strstr(字符串1,字符串2),函数返回值为字符串2在字符串1中第一次出现的地址。如果字符串2不是字符串1的子串,则函数返回NULL。

在上面的代码中,通过scanf函数获取了两个字符串str1和str2,并使用strstr函数来进行判断。如果返回的地址不为NULL,则表示字符串2是字符串1的子串;反之则不是。

二、使用循环遍历判断

#include<stdio.h>
#include<string.h>

int main()
{
    char str1[50],str2[50];
    int i,j,flag=0;
    printf("请输入字符串1:\n");
    scanf("%s",str1);
    printf("请输入字符串2:\n");
    scanf("%s",str2);
    for(i=0;i<strlen(str1);i++)
    {
        if(str1[i]==str2[0])
        {
            flag=1;
            for(j=0;j<strlen(str2);j++)
            {
                if(str1[i+j]!=str2[j])
                {
                    flag=0;
                    break;
                }
            }
            if(flag==1)
                break;
        }
    }
    if(flag==1)
        printf("字符串2是字符串1的子串\n");
    else
        printf("字符串2不是字符串1的子串\n");
    return 0;
}

除了使用strstr函数之外,我们也可以使用循环来遍历字符串中的每个字符,并判断是否符合子串。在上面的代码中,我们首先通过scanf函数获取了两个字符串str1和str2,并使用两个循环变量i和j分别对字符串1和字符串2进行遍历。

如果字符串1中的某个字符与字符串2的第一个字符相同,我们就认为找到了一个可能的子串,并使用flag变量进行标记。接着,在内层循环中,我们依次比较字符串1中与找到的字符串2的第1个字符相同的字符是否也与字符串2中对应位置的字符相同。如果比较过程中有任何一个字符不相同,就说明找到的子串是错误的。最后,根据flag的取值来判断字符串2是否是字符串1的子串。

三、使用递归函数判断

#include<stdio.h>
#include<string.h>

int match(char *s1,char *s2)
{
    if(*s1=='\0'||*s2=='\0')
        return 0;
    if(*s1==*s2)
        return match(s1+1,s2+1)+1;
    else
        return 0;
}

int main()
{
    char str1[50],str2[50];
    int i,result=0;
    printf("请输入字符串1:\n");
    scanf("%s",str1);
    printf("请输入字符串2:\n");
    scanf("%s",str2);
    for(i=0;i<strlen(str1)-strlen(str2)+1;i++)
    {
        if(match(str1+i,str2)==strlen(str2))
        {
            result=1;
            break;
        }
    }
    if(result==1)
        printf("字符串2是字符串1的子串\n");
    else
        printf("字符串2不是字符串1的子串\n");
    return 0;
}

我们还可以使用递归函数来判断一个字符串是否包含另一个字符串。在上面的代码中,我们定义了一个match函数,用于判断字符串s1中从当前位置开始的子串是否与字符串s2相等。如果相等,则返回字符串s2的长度;否则返回0。

在主函数中,我们通过循环遍历字符串1中的每个字符,并使用match函数来判断以当前字符为起始的子串是否与字符串2相等。如果找到一个符合要求的子串,则认为字符串2是字符串1的子串。否则,在循环结束时,我们将result变量的值置为0,表示字符串2不是字符串1的子串。

四、使用KMP算法判断

#include<stdio.h>
#include<string.h>

void getNext(char *p,int *next)
{
    int i=0,j=-1;
    next[0]=-1;
    while(i<strlen(p)-1)
    {
        if(j==-1||p[i]==p[j])
        {
            i++;
            j++;
            next[i]=j;
        }
        else
            j=next[j];
    }
}

int KMP(char *s,char *p)
{
    int next[strlen(p)];
    getNext(p,next);
    int i=0,j=0;
    while(i<strlen(s)&&j<strlen(p))
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }
    if(j==strlen(p))
        return i-j;
    else
        return -1;
}

int main()
{
    char str1[50],str2[50];
    int pos=-1;
    printf("请输入字符串1:\n");
    scanf("%s",str1);
    printf("请输入字符串2:\n");
    scanf("%s",str2);
    pos=KMP(str1,str2);
    if(pos!=-1)
        printf("字符串2是字符串1的子串\n");
    else
        printf("字符串2不是字符串1的子串\n");
    return 0;
}

KMP算法是一种高效的字符串匹配算法,可以在O(n+m)的时间复杂度内完成字符串匹配。在上面的代码中,我们先通过getNext函数来构建字符串2的next数组,用于辅助KMP算法进行匹配。在getNext函数中,我们使用i和j两个变量来遍历字符串p,并通过next数组来记录当前匹配失败时应该回退的位置。

在KMP函数中,我们使用i和j两个变量来遍历字符串s和p,在匹配失败时,通过next数组快速回退到下一个开始匹配的位置。最后,如果匹配成功,则返回匹配成功的位置;反之则返回-1。

五、总结

本文介绍了四种不同的方法来判断一个字符串是否包含子串。其中,strstr函数是最简单且最好理解的方法;循环遍历和递归函数则比较容易实现,但效率稍低;KMP算法则是最优秀的字符串匹配算法,可以在较短的时间内完成匹配。

无论使用哪种方法,都需要仔细考虑边界情况和特殊情况,以保证计算结果的正确性。在实际编程中,我们还可以根据不同的应用场景来选择最合适的方法,以尽可能提高程序的执行效率。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/245503.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:09
下一篇 2024-12-12 13:09

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python字符串宽度不限制怎么打代码

    本文将为大家详细介绍Python字符串宽度不限制时如何打代码的几个方面。 一、保持代码风格的统一 在Python字符串宽度不限制的情况下,我们可以写出很长很长的一行代码。但是,为了…

    编程 2025-04-29
  • Python中将字符串转化为浮点数

    本文将介绍在Python中将字符串转化为浮点数的常用方法。在介绍方法之前,我们先来思考一下这个问题应该如何解决。 一、eval函数 在Python中,最简单、最常用的将字符串转化为…

    编程 2025-04-29
  • 如何在Python中实现平方运算?

    在Python中,平方运算是常见的数学运算之一。本文将从多个方面详细阐述如何在Python中实现平方运算。 一、使用乘法运算实现平方 平方运算就是一个数乘以自己,因此可以使用乘法运…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python学习笔记:去除字符串最后一个字符的方法

    本文将从多个方面详细阐述如何通过Python去除字符串最后一个字符,包括使用切片、pop()、删除、替换等方法来实现。 一、字符串切片 在Python中,可以通过字符串切片的方式来…

    编程 2025-04-29
  • 如何在树莓派上安装Windows 7系统?

    随着树莓派的普及,许多用户想在树莓派上安装Windows 7操作系统。 一、准备工作 在开始之前,需要准备以下材料: 1.树莓派4B一台; 2.一张8GB以上的SD卡; 3.下载并…

    编程 2025-04-29
  • 如何在Python中找出所有的三位水仙花数

    本文将介绍如何使用Python语言编写程序,找出所有的三位水仙花数。 一、什么是水仙花数 水仙花数也称为自恋数,是指一个n位数(n≥3),其各位数字的n次方和等于该数本身。例如,1…

    编程 2025-04-29

发表回复

登录后才能评论