C语言计算字符串长度的三种方式及sizeof与strlen的陷阱

小满
小满
发布时间:2026-10-15 | 2人浏览过
原创

C语言计算字符串长度常用方法包括自定义函数、strlen()及sizeof(),三者适用场景不同。strlen统计有效字符不含结束符\0,sizeof统计实际内存大小含\0。特别注意数组作为参数传入函数时会退化为指针,导致sizeof计算结果变为指针字节数,使用时需谨慎。

计算字符串长度的几种方式

在C语言开发中,获取字符串长度是基础操作。主要可以通过手动实现逻辑、调用标准库函数或使用编译期操作符来完成。

第1步:通过自定义函数求长度

目的:理解底层逻辑,适用于禁止使用标准库或特定算法限制的场景。

代码实现:利用while循环遍历字符,直到遇到结束符'\0'为止。

int cont_str(char *s)
{
    int i = 0;     
    while (s[i++] != '\0');
    return --i;
}

第2步:使用 strlen() 库函数

入口:包含头文件 <string.h>。

动作:直接调用标准库函数,返回从起始地址到第一个'\0'之前的字符个数。

size_t len = strlen(str); // 假设str为待求的字符串数组名

第3步:使用 sizeof() 操作符

注意:此方法仅适用于编译期已知大小的字符数组,不适用于动态指针。

int len = sizeof(str)/sizeof(str[0]) - 1; // 计算数组元素个数减1即为字符串长度

核心区别说明:

  • strlen():返回的是字符串的有效长度,不包含末尾的空字符'\0'。它通过扫描内存直到遇到'\0'来计数,属于运行时操作。
  • sizeof():返回的是变量占用的内存总字节数。对于字符数组,结果通常包含末尾的'\0'。它属于编译期操作,不计算内容。

sizeof 和 strlen 常见陷阱与避坑指南

在实际编程(如LeetCode刷题或工程开发)中,混用这两个概念容易导致严重的逻辑错误或内存越界。以下是几个典型陷阱及其解决方案。

陷阱一:strlen 对空间不足的反应

strlen()必须依赖正确的结束符'\0'才能正确工作。如果分配的空间不足以容纳字符串内容加结束符,该函数将无法找到边界,导致读取非法内存。

场景分析:

char str[] = "12345";      // 编译器自动补全 \0,总长6字节。strlen 返回 5。
char str[5] = "12345";     // 无额外空间存 \0。strlen 可能返回随机值或引发段错误。
char str[10] = "12345";    // 空间充足,结尾隐含 \0。strlen 返回 5。

结论:定义字符串数组时,若需使用strlen,确保分配的空间长度 ≥ 字符串内容长度 + 1。

陷阱二:sizeof 在函数传参时的失效

这是最常见的错误来源。当数组名作为参数传递给函数时,它会退化为指针。

原理解析:

在函数内部,sizeof(str) 不再代表整个数组的大小,而是代表指针变量的大小(在32位系统通常为4字节,64位系统为8字节)。

void func(char* str) {
    // 在此处 sizeof(str) 等于 sizeof(char*),通常是 4 或 8
    // 而非原始数组的长度
    printf("%zu\n", sizeof(str)); 
}

陷阱三:指针与数组的混淆

对于字符指针 char *str 和字符数组 char str[],sizeof 的表现截然不同:

  • sizeof(*str):等价于 sizeof(char),结果为 1。
  • sizeof(str)(若是 char*):等价于指针宽度(如 4)。
  • sizeof(str)(若是 char[]):返回分配的内存总大小。

示例对比:

char arr[20] = "12345";
printf("%zu\n", sizeof(arr)); // 输出 20

char ptr[20]; // 未初始化或未声明完整时
// 如果传递的是指针 p,sizeof(p) 固定为指针长度

总结

获取C语言字符串长度时,优先使用 strlen() 获取业务所需的字符数量;仅在需要知道内存布局或缓冲区大小时使用 sizeof()。务必牢记数组传参退化为指针的规则,避免在函数内部滥用 sizeof 计算“伪”长度。以上就是C语言计算字符串长度的详细内容,更多关于C语言基础技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表