ZetCode

C strchr 函数

最后修改:2025 年 4 月 8 日

字符串操作是 C 编程中的基本内容,而 strchr 是在字符串中搜索字符的关键函数。本教程将深入介绍 strchr,包括其语法、用法和潜在的陷阱。我们将探讨实际示例,并为关键应用程序讨论更安全的替代方案。了解 strchr 有助于在保持程序安全的同时高效地定位字符串中的字符。

什么是 strchr?

strchr 函数用于查找字符串中字符的第一个出现。它声明在 string.h 中,并接受两个参数:字符串指针和要查找的字符。strchr 返回指向找到的字符的指针,如果未找到则返回 NULL。如果指定,搜索将包括空终止符。有关边界检查搜索,请考虑 C11 或更高版本中的 strchr_s

基本的 strchr 用法

此示例演示了使用 strchr 在字符串中查找字符。

basic_search.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Hello, World!";
    char ch = 'W';
    
    char *result = strchr(str, ch);
    
    if (result != NULL) {
        printf("Found '%c' at position: %ld\n", ch, result - str);
    } else {
        printf("'%c' not found\n", ch);
    }

    return 0;
}

在这里,strchr 在字符串中搜索 'W'。结果是指向找到的字符的指针。我们通过减去字符串起始地址来计算其位置。这是在空终止字符串中查找字符的一种简单有效的方法。在使用结果之前,请务必检查 NULL,以避免出现未定义的行为。

查找所有出现

此示例展示了如何在字符串中查找字符的所有出现。

all_occurrences.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Mississippi";
    char ch = 's';
    const char *ptr = str;
    
    printf("Positions of '%c' in '%s':\n", ch, str);
    
    while ((ptr = strchr(ptr, ch)) != NULL) {
        printf("%ld ", ptr - str);
        ptr++; // Move past current match
    }
    printf("\n");

    return 0;
}

此代码通过反复调用 strchr 来查找“Mississippi”中的所有 's' 字符。每次找到后,我们将指针递增以搜索剩余的字符串。循环一直持续到 strchr 返回 NULL。此技术对于有效地处理字符串中字符的所有出现很有用。

检查空终止符

此示例演示了使用 strchr 搜索空终止符。

null_search.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Test string";
    char *term = strchr(str, '\0');
    
    if (term != NULL) {
        printf("Null terminator found at position: %ld\n", term - str);
        printf("String length: %ld\n", strlen(str));
    }

    return 0;
}

在这里,我们使用 strchr 搜索空终止符。其位置应与 strlen 返回的字符串长度匹配。此示例表明 strchr 可以像查找任何其他字符一样查找空终止符。此行为有时用于验证字符串终止或手动计算字符串长度。

区分大小写的搜索

此示例演示了 strchr 的区分大小写特性。

case_sensitive.c
#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "Case Sensitive Search";
    char lower = 's';
    char upper = 'S';
    
    char *lower_result = strchr(str, lower);
    char *upper_result = strchr(str, upper);
    
    printf("'%c' found: %s\n", lower, lower_result ? "Yes" : "No");
    printf("'%c' found: %s\n", upper, upper_result ? "Yes" : "No");

    return 0;
}

strchr 执行区分大小写的搜索,区分 's' 和 'S'。该示例显示了对小写和大写搜索的不同结果。对于不区分大小写的搜索,请考虑 strcasestr(非标准 C)或先将字符串转换为统一的大小写。当大小写在您的应用程序逻辑中很重要时,此行为很重要。

安全替代方案:strchr_s

此示例演示了 C11 中可用的更安全的 strchr_s 函数。

safe_search.c
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main() {
    const char str[] = "Safe search example";
    char ch = 'e';
    char *result;
    
    errno_t err = strchr_s(str, sizeof(str), ch, &result);
    
    if (err == 0 && result != NULL) {
        printf("Found '%c' at position: %ld\n", ch, result - str);
    } else if (err != 0) {
        printf("Error in search\n");
    } else {
        printf("'%c' not found\n", ch);
    }

    return 0;
}

strchr_s 添加了边界检查和显式错误处理。它将字符串大小作为参数,并通过 errno_t 值返回错误。这有助于防止缓冲区溢出和未定义的行为。虽然并非普遍可用,但在针对 C11 或更高版本标准并支持边界检查的情况下,建议用于安全关键代码。

__STDC_WANT_LIB_EXT1__ 定义为 1,以明确表示程序希望使用 C11 标准库的可选扩展。没有此宏,编译器可能不会提供某些更安全的功能,包括 strchr_s。此功能允许开发人员有选择地启用附加功能,以提高其程序的安全性和可靠性。

使用 strchr 的最佳实践

来源

C strchr 文档

本教程探讨了 strchr 函数,从基本用法到高级注意事项。虽然它功能强大,但请始终小心使用字符串操作,以防止程序中的安全漏洞和未定义的行为。

作者

我的名字是 Jan Bodnar,我是一名敬业的程序员,对编码充满热情。自 2007 年以来,我通过 1,400 多篇文章和 8 本电子书分享了我的专业知识。凭借十多年的教学经验,我致力于使编程易于理解和引人入胜。

列表 C 标准库