📜  C |字串|问题3(1)

📅  最后修改于: 2023-12-03 14:59:38.214000             🧑  作者: Mango

C 字符串问题 3

在 C 语言中,字符串是一个常见的数据类型。C 字符串以 '\0'(NULL 字符)结尾,也被称为字符串终止符。在使用字符串时,经常需要进行字符串拷贝、字符串比较、字符串连接等操作。本文将介绍 C 语言中常见的字符串问题之一:如何检测字符串中是否存在某个子串。

问题描述

给定两个字符串 str1str2,请编写 C 语言程序,判断 str2 是否为 str1 的子串。

  • str2str1 的子串,返回 1
  • str2 不是 str1 的子串,返回 0
解决方案

C 语言提供了多种方法来检测字符串中是否存在某个子串,例如使用 strstr() 函数或者自己实现一个字符串匹配算法。下面分别介绍这两种方法。

使用 strstr() 函数

strstr() 函数是 C 语言标准库提供的一个函数,用于在字符串中查找子串。该函数的原型为:

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

其中,str1 是要查找的字符串,str2 是要查找的子串。该函数返回指向 str2str1 中第一次出现的位置的指针。若 str2 不是 str1 的子串,则返回 NULL

使用 strstr() 函数,可以很快地解决本问题。代码如下:

int isSubstring(char *str1, char *str2) {
    char *pos = strstr(str1, str2);
    if (pos != NULL) {
        return 1;
    } else {
        return 0;
    }
}
实现字符串匹配算法

除了使用 strstr() 函数外,还可以自己实现一个字符串匹配算法。常用的字符串匹配算法有暴力匹配算法(Brute Force)、KMP 算法(Knuth-Morris-Pratt Algorithm)和 BM 算法(Boyer-Moore Algorithm)等。这里我们介绍一种简单的暴力匹配算法。

暴力匹配算法的思路很简单,对于字符串 str1 和子串 str2,从 str1 的第一个字符开始,依次与 str2 的第一个字符、第二个字符、第三个字符......进行比较。如果所有字符都匹配成功,则说明 str2str1 的一个子串。

具体实现如下:

int isSubstring(char *str1, char *str2) {
    int i, j;
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    for (i = 0; i <= len1 - len2; i++) {
        for (j = 0; j < len2; j++) {
            if (str1[i+j] != str2[j]) {
                break;
            }
        }
        if (j == len2) {
            return 1;
        }
    }
    return 0;
}
结语

本文介绍了解决 C 语言字符串问题之一:如何检测字符串中是否存在某个子串。我们介绍了两种方法:使用 strstr() 函数和实现一个暴力匹配算法。在实际使用中,可以根据需要选择适合自己的方法进行字符串匹配。