在C语言中,没有一个内置的、名为 contains 的函数,这个概念通常出现在像 Python、JavaScript 或 Java 这样的高级语言中,用来检查一个字符串是否包含另一个子串。

(图片来源网络,侵删)
在C语言中,你需要自己实现这个功能,或者使用标准库中的相关函数来组合实现,下面我将为你介绍几种最常见和实用的方法。
使用标准库 strstr() 函数 (最推荐)
这是最直接、最标准的方法。strstr() 函数在 <string.h> 头文件中定义,它的作用是在一个字符串中查找另一个子串。
函数原型:
char *strstr(const char *haystack, const char *needle);
参数:

(图片来源网络,侵删)
haystack: 要被搜索的主字符串(“草堆”)。needle: 要查找的子串(“针”)。
返回值:
- 如果找到
needle,则返回一个指向haystack中needle首次出现位置的指针。 - 如果没有找到
needle,则返回NULL。
如何实现 contains 功能:
你可以通过检查 strstr() 的返回值是否为 NULL 来判断一个字符串是否包含另一个字符串。
示例代码:
#include <stdio.h>
#include <string.h> // 必须包含这个头文件
// 定义一个 contains 函数,使其行为更接近高级语言
int contains(const char *haystack, const char *needle) {
// needle 是空字符串,通常认为它被包含在任何字符串中
// 或者根据需求处理,这里我们假设包含
if (*needle == '\0') {
return 1;
}
return strstr(haystack, needle) != NULL;
}
int main() {
const char *str1 = "Hello, world!";
const char *str2 = "world";
const char *str3 = "goodbye";
if (contains(str1, str2)) {
printf("'%s' 包含 '%s'\n", str1, str2); // 输出: 'Hello, world!' 包含 'world'
} else {
printf("'%s' 不包含 '%s'\n", str1, str2);
}
if (contains(str1, str3)) {
printf("'%s' 包含 '%s'\n", str1, str3);
} else {
printf("'%s' 不包含 '%s'\n", str1, str3); // 输出: 'Hello, world!' 不包含 'goodbye'
}
return 0;
}
手动实现字符串查找
理解 strstr() 的工作原理对学习C语言很有帮助,你可以自己写一个简单的循环来实现这个功能。
基本思路:
- 遍历主字符串
haystack的每一个字符。 - 对于
haystack中的每一个字符,都假设它是子串needle的起始点。 - 然后逐个比较
haystack的后续字符和needle的所有字符。 - 如果所有字符都匹配上了,就找到了,返回
1(或true)。 - 如果遍历完
haystack都没找到,就返回0(或false)。
示例代码:
#include <stdio.h>
// 手动实现的 contains 函数
int my_contains(const char *haystack, const char *needle) {
// 处理 needle 为空字符串的情况
if (*needle == '\0') {
return 1;
}
int i = 0;
while (haystack[i] != '\0') {
int j = 0;
// 尝试从 haystack[i] 开始匹配 needle
while (haystack[i + j] == needle[j] && needle[j] != '\0') {
j++;
}
// j 移动了 needle 的长度,说明完全匹配
if (needle[j] == '\0') {
return 1; // 找到,返回 true
}
i++;
}
return 0; // 没找到,返回 false
}
int main() {
const char *str1 = "Programming is fun";
const char *str2 = "fun";
const char *str3 = "C++";
if (my_contains(str1, str2)) {
printf("手动实现: '%s' 包含 '%s'\n", str1, str2); // 输出: 手动实现: 'Programming is fun' 包含 'fun'
} else {
printf("手动实现: '%s' 不包含 '%s'\n", str1, str2);
}
if (my_contains(str1, str3)) {
printf("手动实现: '%s' 包含 '%s'\n", str1, str3);
} else {
printf("手动实现: '%s' 不包含 '%s'\n", str1, str3); // 输出: 手动实现: 'Programming is fun' 不包含 'C++'
}
return 0;
}
注意: 这个手动实现是一个简化版本,标准的
strstr()函数在实现上可能更高效(例如使用更复杂的算法如Boyer-Moore),但对于大多数简单场景,这个版本已经足够。
使用 strcasestr() (不区分大小写)
如果你需要执行不区分大小写的包含检查,可以使用 strcasestr() 函数,它不是C标准库的一部分,但在Linux/macOS的 <string.h> 中是可用的,在Windows上,你可能需要自己实现或使用其他方法。
示例代码 (Linux/macOS):
#include <stdio.h>
#include <string.h>
int contains_case_insensitive(const char *haystack, const char *needle) {
// strcasestr 在找不到时返回 NULL
return strcasestr(haystack, needle) != NULL;
}
int main() {
const char *str1 = "Hello, World!";
const char *str2 = "world"; // 小写
if (contains_case_insensitive(str1, str2)) {
printf("'%s' (不区分大小写) 包含 '%s'\n", str1, str2); // 输出: 'Hello, World!' (不区分大小写) 包含 'world'
} else {
printf("'%s' (不区分大小写) 不包含 '%s'\n", str1, str2);
}
return 0;
}
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
strstr() |
标准、高效、简洁 | 区分大小写 | 绝大多数情况下的首选 |
| 手动实现 | 有助于理解底层原理 | 代码较长,效率可能较低 | 学习目的,或在没有标准库的受限环境中 |
strcasestr() |
不区分大小写 | 非标准,Windows上不可用 | 需要不区分大小写的搜索时(Linux/macOS) |
对于日常的C语言编程,强烈推荐使用方法一,即 <string.h> 中的 strstr() 函数,这是最符合C语言习惯且性能最好的方式。
