ZetCode

C strpbrk 函数

最后修改:2025 年 4 月 8 日

字符串扫描操作在 C 编程中至关重要,而 strpbrk 是一个用于在字符串中定位字符的强大函数。本教程将深入介绍 strpbrk,包括其语法、用法和实际应用。我们将探讨各种示例,并在适当的时候讨论更安全的替代方案。理解 strpbrk 有助于高效地处理和分析字符串数据。

什么是 strpbrk?

strpbrk 函数在字符串中搜索任何一组字符。它声明在 string.h 中,并接受两个参数:要搜索的字符串和要查找的字符集。strpbrk 返回指向集合中任何字符首次出现的指针,如果未找到,则返回 NULL。对于安全关键代码,请考虑在扫描之前验证输入字符串。

基本 strpbrk 用法

此示例演示了使用 strpbrk 在字符串中查找元音字母。

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

int main() {
    const char *text = "Hello, World!";
    const char *vowels = "aeiouAEIOU";
    
    char *result = strpbrk(text, vowels);
    
    if (result != NULL) {
        printf("First vowel '%c' found at position %ld\n", 
               *result, result - text);
    } else {
        printf("No vowels found\n");
    }

    return 0;
}

在这里,strpbrk 扫描 text 以查找任何元音字母。它返回指向第一个匹配项(在本例中为“e”)的指针,如果未找到元音字母,则返回 NULL。位置是通过指针算术计算的。这是在字符串中查找特定字符组的一种简单有效的方法。始终检查 NULL 以处理未找到匹配项的情况。

查找多个出现

此示例显示了如何查找集合中字符的所有出现。

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

int main() {
    const char *text = "The quick brown fox jumps over the lazy dog";
    const char *search_chars = "aeiou";
    
    char *ptr = (char *)text;
    int count = 0;
    
    while ((ptr = strpbrk(ptr, search_chars)) != NULL) {
        printf("Found '%c' at position %ld\n", *ptr, ptr - text);
        ptr++;
        count++;
    }
    
    printf("Total vowels found: %d\n", count);
    return 0;
}

此代码通过重复调用 strpbrk 来计算句子中的所有元音字母。每次匹配后,指针都会递增,以继续搜索剩余的字符串。当 strpbrk 返回 NULL 时,循环终止。此模式对于处理字符串中多个字符的所有出现很有用。请注意,原始字符串保持不变。

验证输入字符

此示例演示了使用 strpbrk 进行输入验证。

input_validation.c
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool is_valid_filename(const char *name) {
    const char *invalid_chars = "\\/:*?\"<>|";
    return strpbrk(name, invalid_chars) == NULL;
}

int main() {
    const char *filename = "report_2024.pdf";
    
    if (is_valid_filename(filename)) {
        printf("'%s' is a valid filename\n", filename);
    } else {
        printf("'%s' contains invalid characters\n", filename);
    }
    
    return 0;
}

在这里,strpbrk 检查无效的文件名字符。如果未找到无效字符,则函数返回 true。这是文件操作中输入验证的实际应用。这种方法对于检查多个不允许的字符非常有效。对于更复杂的验证,正则表达式可能更合适。

使用 strpbrk 进行标记化

此示例展示了如何使用 strpbrk 进行简单的标记化。

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

int main() {
    const char *data = "name=John;age=30;city=New York";
    const char *delimiters = ";=";
    
    char *ptr = (char *)data;
    char *token;
    
    while ((token = strpbrk(ptr, delimiters)) != NULL) {
        printf("Found delimiter '%c' at position %ld\n", *token, token - ptr);
        ptr = token + 1;
    }
    
    return 0;
}

此代码识别键值字符串中的所有分隔符。strpbrk 查找 ';' 或 '=' 字符。虽然不是完整的标记器,但这演示了 strpbrk 如何帮助解析结构化文本。为了完全解析,您需要提取分隔符之间的值。这种方法对于简单的配置文件或数据格式很有用。

不区分大小写的搜索

此示例实现了使用 strpbrk 进行不区分大小写的搜索。

case_insensitive.c
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *strpbrk_ci(const char *s, const char *accept) {
    while (*s != '\0') {
        for (const char *a = accept; *a != '\0'; a++) {
            if (tolower(*s) == tolower(*a)) {
                return (char *)s;
            }
        }
        s++;
    }
    return NULL;
}

int main() {
    const char *text = "Hello World";
    const char *search = "aeiou";
    
    char *result = strpbrk_ci(text, search);
    
    if (result != NULL) {
        printf("Found '%c' at position %ld\n", *result, result - text);
    }
    
    return 0;
}

由于 strpbrk 是区分大小写的,因此此示例提供了一个自定义的不区分大小写的版本。该函数比较每个字符的小写版本。当搜索中不区分大小写时,此方法很有用。请注意,此实现比标准的 strpbrk 效率较低,因为它需要额外的函数调用。对于性能关键代码,请考虑先将字符串转换为单一大小写。

使用 strpbrk 的最佳实践

来源

C strpbrk 文档

本教程从基本用法到高级应用,探讨了 strpbrk 函数。虽然它对于字符扫描非常强大,但请务必考虑输入验证和边缘情况,以确保程序中可靠的字符串处理。

作者

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

列表 C 标准库