如何在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/zh-hant/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

發表回復

登錄後才能評論