C语言contains函数怎么用?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 C语言 正文

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

c语言contains
(图片来源网络,侵删)

在C语言中,你需要自己实现这个功能,或者使用标准库中的相关函数来组合实现,下面我将为你介绍几种最常见和实用的方法。

使用标准库 strstr() 函数 (最推荐)

这是最直接、最标准的方法。strstr() 函数在 <string.h> 头文件中定义,它的作用是在一个字符串中查找另一个子串。

函数原型:

char *strstr(const char *haystack, const char *needle);

参数:

c语言contains
(图片来源网络,侵删)
  • haystack: 要被搜索的主字符串(“草堆”)。
  • needle: 要查找的子串(“针”)。

返回值:

  • 如果找到 needle,则返回一个指向 haystackneedle 首次出现位置的指针。
  • 如果没有找到 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语言很有帮助,你可以自己写一个简单的循环来实现这个功能。

基本思路:

  1. 遍历主字符串 haystack 的每一个字符。
  2. 对于 haystack 中的每一个字符,都假设它是子串 needle 的起始点。
  3. 然后逐个比较 haystack 的后续字符和 needle 的所有字符。
  4. 如果所有字符都匹配上了,就找到了,返回 1 (或 true)。
  5. 如果遍历完 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语言习惯且性能最好的方式。

-- 展开阅读全文 --
头像
dede时间格式如何转换?
« 上一篇 04-16
dede首页滚动图片如何实现?
下一篇 » 04-16

相关文章

取消
微信二维码
支付宝二维码

目录[+]