ZetCode

C strlen 函数

最后修改:2025 年 4 月 8 日

字符串操作在 C 编程中是基础性的,而 strlen 是确定字符串长度的关键函数。本教程将深入探讨 strlen,包括其语法、用法和潜在的陷阱。我们将通过实际示例进行探讨,并为关键应用程序讨论更安全的替代方案。理解 strlen 有助于管理字符串操作,同时保持程序的安全性和可靠性。

什么是 strlen?

strlen 函数计算以 null 结尾的字符串的长度。它在 string.h 中声明,并接受一个参数:指向字符串的指针。strlen 计数字符,直到遇到 null 终止符。对于安全关键代码,请考虑 strnlen,它包含一个最大长度参数以防止缓冲区溢出。

strlen 的基本用法

此示例演示了使用 strlen 进行的基本字符串长度计算。

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

int main() {
    char text[] = "Hello, World!";
    size_t length = strlen(text);

    printf("String: %s\n", text);
    printf("Length: %zu\n", length);

    return 0;
}

在此,strlentext 中的字符进行计数,直到找到 null 终止符。长度存储在 size_t 变量中,这是 C 中大小的正确类型。对于“Hello, World!”,该函数返回 13,因为它不计算 null 终止符。在使用 strlen 之前,请务必确保字符串已正确以 null 结尾。

比较字符串长度

此示例显示了如何使用 strlen 比较字符串长度。

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

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    size_t len1 = strlen(str1);
    size_t len2 = strlen(str2);

    if (len1 > len2) {
        printf("'%s' is longer\n", str1);
    } else if (len2 > len1) {
        printf("'%s' is longer\n", str2);
    } else {
        printf("Strings are equal length\n");
    }

    return 0;
}

此代码使用 strlen 比较两个字符串的长度。在比较之前,长度存储在 size_t 变量中。请注意,这仅比较长度,而不比较内容。字符串长度比较通常用于排序算法或输入验证。请记住,strlen 必须遍历整个字符串才能找到其长度。

将 strlen 与指针一起使用

此示例演示了带有字符串指针的 strlen

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

int main() {
    const char *message = "Pointer to a string literal";
    size_t length = strlen(message);

    printf("Message: %s\n", message);
    printf("Length: %zu\n", length);
    printf("First character: %c\n", *message);
    printf("Last character before null: %c\n", *(message + length - 1));

    return 0;
}

在这里,strlen 与指向字符串字面量的指针一起使用。该函数遍历字符串,直到找到 null 终止符。我们演示了如何使用指针算术访问第一个和最后一个字符。请注意,C 中的字符串字面量是不可变的。const 限定符有助于防止字面量的意外修改。

安全替代方案:strnlen

此示例演示了更安全的 strnlen 函数。

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

int main() {
    char buffer[10] = "Test";
    size_t max_len = sizeof(buffer);
    
    // Safe length check with bounds
    size_t length = strnlen(buffer, max_len);

    printf("String: %s\n", buffer);
    printf("Length: %zu\n", length);
    printf("Buffer size: %zu\n", max_len);

    return 0;
}

strnlen 接受一个最大长度参数,以防止读取超出缓冲区。它返回字符串长度或最大长度中的较小者。在处理不受信任的输入时,这对于安全至关重要。strnlen 在 POSIX 和许多现代 C 实现中都可用。在处理已知最大大小的缓冲区时,请始终优先使用它。

手动计算字符串长度

此示例显示了 strlen 的内部工作原理。

manual_length.c
#include <stdio.h>

size_t my_strlen(const char *str) {
    size_t count = 0;
    while (*str++) {
        count++;
    }
    return count;
}

int main() {
    char text[] = "Understand strlen";
    size_t length = my_strlen(text);

    printf("String: %s\n", text);
    printf("Calculated length: %zu\n", length);

    return 0;
}

此实现通过计算直到 null 终止符的字符来模拟 strlen。该函数接受一个 const 指针,因为它不修改字符串。请注意,实际实现通常使用特定于体系结构的指令进行高度优化。理解这一点有助于认识到为什么 strlen 具有 O(n) 的时间复杂度。

使用 strlen 的最佳实践

来源

C strlen 文档

本教程探讨了 strlen 函数,从基本用法到高级注意事项。虽然很简单,但请始终谨慎使用字符串操作,以防止程序中的安全漏洞和未定义行为。

作者

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

列表 C 标准库