C strlen 函数
最后修改:2025 年 4 月 8 日
字符串操作在 C 编程中是基础性的,而 strlen
是确定字符串长度的关键函数。本教程将深入探讨 strlen
,包括其语法、用法和潜在的陷阱。我们将通过实际示例进行探讨,并为关键应用程序讨论更安全的替代方案。理解 strlen
有助于管理字符串操作,同时保持程序的安全性和可靠性。
什么是 strlen?
strlen
函数计算以 null 结尾的字符串的长度。它在 string.h
中声明,并接受一个参数:指向字符串的指针。strlen
计数字符,直到遇到 null 终止符。对于安全关键代码,请考虑 strnlen
,它包含一个最大长度参数以防止缓冲区溢出。
strlen 的基本用法
此示例演示了使用 strlen
进行的基本字符串长度计算。
#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; }
在此,strlen
对 text
中的字符进行计数,直到找到 null 终止符。长度存储在 size_t
变量中,这是 C 中大小的正确类型。对于“Hello, World!”,该函数返回 13,因为它不计算 null 终止符。在使用 strlen
之前,请务必确保字符串已正确以 null 结尾。
比较字符串长度
此示例显示了如何使用 strlen
比较字符串长度。
#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
。
#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
函数。
#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
的内部工作原理。
#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 的最佳实践
- 检查 null 指针:在调用 strlen 之前,始终验证字符串不是 NULL。
- 缓冲区首选 strnlen:当已知最大大小时,使用 strnlen。
- 避免在性能关键循环中使用:strlen 的 O(n) 复杂度会影响性能。
- 重复使用时存储长度:如果您需要多次使用长度,请缓存结果。
- 确保正确终止:在使用 strlen 之前,请验证字符串是否已以 null 结尾。
来源
本教程探讨了 strlen
函数,从基本用法到高级注意事项。虽然很简单,但请始终谨慎使用字符串操作,以防止程序中的安全漏洞和未定义行为。
作者
列表 C 标准库。