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 标准库。