在c语言中获取字符串的长度是我们开发中常见的需求,比如检查用户输入字符串的长度、字符串截取、字符串拼接等这些操作都需要计算字符串的长度。
下面介绍C语言获取字符串长度的几种方法,根据示例您可以快速上手使用。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "online-compiler.com";
size_t len = strlen(str); // 返回值为19
printf("Length: %zu\n", len);
return 0;
}
其原理是遍历字符串直到遇到\0,返回计数值。
更加灵活,适合特殊场景使用,看下面的例子。
#include <stdio.h>
size_t strlen(const char *s) {
size_t len = 0;
while (s[len] != '\0') {
len++;
}
return len;
}
int main() {
char str[] = "online";
size_t len = strlen(str); // 返回值为6
printf("Length: %zu\n", len);
return 0;
}
通过指针移动计算起始地址与终止地址的差值,看下面的例子。
#include <stdio.h>
size_t ptr_strlen(const char *s) {
const char *p = s;
while (*p != '\0') p++;
return p - s;
}
int main() {
char str[] = "online";
size_t len = ptr_strlen(str); // 返回值为6
printf("Length: %zu\n", len);
return 0;
}
递归检查每个字符,直到\0。
不建议使用该方法计算字符串长度。
#include <stdio.h>
size_t recursive_strlen(const char *s) {
if (*s == '\0') return 0;
return 1 + recursive_strlen(s + 1);
}
int main() {
char str[] = "online";
size_t len = recursive_strlen(str); // 返回值为6
printf("Length: %zu\n", len);
return 0;
}
仅适用于在定义作用域内获取静态字符数组的长度(不包括动态字符串),若数组未显式初始化或为指针,sizeof无法正确计算字符串长度。
#include <stdio.h>
int main() {
char str[] = "online"; // 静态数组
size_t len = sizeof(str) - 1; // 减1排除末尾的'\0',返回值为6
printf("Length: %zu\n", len);
return 0;
}
方法 | 时间复杂度 | 空间复杂度 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|---|
strlen | O(n) | O(1) | 通用场景 | 高效、可读性好 | 需保证字符串以\0结尾 |
自定义函数 | O(n) | O(1) | 无库环境、自定义逻辑 | 可控性强,可优化 | 代码冗长 |
指针算术 | O(n) | O(1) | 高效遍历、指针操作 | 简洁,适合复杂操作 | 需理解指针 |
递归 | O(n) | O(n) | 教学示例 | 展示递归思想 | 栈溢出风险,效率极低 |
sizeof | O(1) | O(1) | 静态数组 | 零运行时开销 | 仅限静态数组,不通用 |