📅  最后修改于: 2023-12-03 14:59:38.214000             🧑  作者: Mango
在 C 语言中,字符串是一个常见的数据类型。C 字符串以 '\0'
(NULL 字符)结尾,也被称为字符串终止符。在使用字符串时,经常需要进行字符串拷贝、字符串比较、字符串连接等操作。本文将介绍 C 语言中常见的字符串问题之一:如何检测字符串中是否存在某个子串。
给定两个字符串 str1
和 str2
,请编写 C 语言程序,判断 str2
是否为 str1
的子串。
str2
为 str1
的子串,返回 1
。str2
不是 str1
的子串,返回 0
。C 语言提供了多种方法来检测字符串中是否存在某个子串,例如使用 strstr()
函数或者自己实现一个字符串匹配算法。下面分别介绍这两种方法。
strstr()
函数是 C 语言标准库提供的一个函数,用于在字符串中查找子串。该函数的原型为:
char *strstr(const char *str1, const char *str2);
其中,str1
是要查找的字符串,str2
是要查找的子串。该函数返回指向 str2
在 str1
中第一次出现的位置的指针。若 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
的第一个字符、第二个字符、第三个字符......进行比较。如果所有字符都匹配成功,则说明 str2
是 str1
的一个子串。
具体实现如下:
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()
函数和实现一个暴力匹配算法。在实际使用中,可以根据需要选择适合自己的方法进行字符串匹配。