ZetCode

C strcspn 函数

最后修改:2025 年 4 月 8 日

字符串操作是 C 编程的基础,而 strcspn 是扫描字符串的关键函数。本教程将深入介绍 strcspn,包括其语法、用法和实际应用。我们将通过示例探讨如何查找集合中任何字符的第一次出现。理解 strcspn 有助于 C 程序中的输入验证和字符串解析任务。

什么是 strcspn?

strcspn 函数计算字符串中不包含指定集合中任何字符的初始段的长度。它声明在 string.h 中,并接受两个参数:要扫描的字符串和要拒绝的字符集。该函数返回第一个匹配项之前的字符数。对于安全关键代码,请考虑在将输入字符串传递给 strcspn 之前进行验证。

基本的 strcspn 用法

此示例演示了查找任何元音之前的子字符串长度。

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

int main() {
    const char *str = "Hello, World!";
    const char *reject = "aeiouAEIOU";
    
    size_t len = strcspn(str, reject);
    
    printf("String: %s\n", str);
    printf("Length before first vowel: %zu\n", len);
    
    return 0;
}

在这里,strcspn 扫描 str 直到找到 reject 中的任何元音。它返回 1,因为 'e' 是位置 1 处的第一个元音。%zu 格式说明符正确打印 size_t 值。这对于查找前缀或验证字符串格式非常有用。

查找第一个数字

此示例显示如何定位字符串中的第一个数字。

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

int main() {
    const char *input = "User1234";
    const char *digits = "0123456789";
    
    size_t pos = strcspn(input, digits);
    
    if (input[pos] != '\0') {
        printf("First digit '%c' at position %zu\n", input[pos], pos);
    } else {
        printf("No digits found\n");
    }
    
    return 0;
}

代码扫描 input 直到找到任何数字字符。它返回 4,因为 '1' 是位置 4 处的第一个数字。我们检查返回位置处的字符是否不是 null,以确认找到了数字。此技术对于解析混合字母数字字符串很有用。

验证不含特殊字符的输入

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

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

int main() {
    const char *username = "john_doe";
    const char *invalid_chars = "!@#$%^&*()";
    
    if (strcspn(username, invalid_chars) == strlen(username)) {
        printf("Valid username\n");
    } else {
        printf("Invalid character found\n");
    }
    
    return 0;
}

在这里,我们检查 username 是否包含任何无效字符。如果 strcspn 返回字符串长度,则未找到无效字符。这是一种将字符串与字符黑名单进行验证的简单方法。对于生产代码,请考虑更健壮的验证函数。

提取分隔符之前的标记

此示例显示如何提取分隔符之前的标记。

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

int main() {
    const char *path = "/home/user/documents";
    const char *delimiters = "/\\";
    
    size_t len = strcspn(path + 1, delimiters);
    char dirname[20];
    
    strncpy(dirname, path + 1, len);
    dirname[len] = '\0';
    
    printf("First directory: %s\n", dirname);
    
    return 0;
}

该代码通过扫描初始斜杠来查找 Unix 路径中的第一个目录名。strcspn 返回下一个斜杠或反斜杠之前的长度。我们将此子字符串复制到 dirname 并将其置 null 终止。此技术对于简单的路径解析任务很有用。

查找第一个空白字符

此示例定位字符串中的第一个空白字符。

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

int main() {
    const char *text = "Find the first space";
    const char *whitespace = " \t\n\r\f\v";
    
    size_t pos = strcspn(text, whitespace);
    
    printf("First whitespace at position: %zu\n", pos);
    printf("Word before whitespace: %.*s\n", (int)pos, text);
    
    return 0;
}

代码扫描 text 直到找到任何空白字符。%.*s 格式通过指定最大长度来打印第一个单词。这演示了 strcspn 如何帮助进行基本的文本处理。对于复杂的解析,请考虑正则表达式或专用解析库。

使用 strcspn 的最佳实践

来源

C strcspn 文档

本教程从基本用法到实际应用,探讨了 strcspn 函数。虽然简单,但正确使用时,它对于字符串扫描任务非常强大。处理不受信任的输入字符串时,请务必考虑安全影响。

作者

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

列表 C 标准库