C语言如何获取字符串长度?

99ANYc3cd6
预计阅读时长 9 分钟
位置: 首页 C语言 正文

使用 strlen 函数(推荐)

strlen 是 C 标准库 <string.h> 中提供的函数,用于计算字符串的长度(不包括终止符 '\0')。

示例代码

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    size_t length = strlen(str); // 返回字符串长度
    printf("字符串长度: %zu\n", length); // %zu 用于 size_t 类型
    return 0;
}

输出:

字符串长度: 13

注意事项

  • strlen 会遍历字符串直到遇到 '\0',因此如果字符串未正确终止(如 char str[] = {'H', 'e', 'l', 'l', 'o'}),会导致未定义行为(UB)。
  • 时间复杂度是 O(n),因为它需要遍历整个字符串。

手动计算字符串长度

如果不使用 strlen,可以自己遍历字符串计算长度:

示例代码

#include <stdio.h>
size_t custom_strlen(const char *str) {
    size_t len = 0;
    while (str[len] != '\0') { // 遍历直到遇到 '\0'
        len++;
    }
    return len;
}
int main() {
    char str[] = "Hello, World!";
    size_t length = custom_strlen(str);
    printf("字符串长度: %zu\n", length);
    return 0;
}

输出:

字符串长度: 13

注意事项

  • strlen 一样,必须确保字符串以 '\0'
  • 这种方法适用于理解字符串遍历原理,但实际开发中建议直接使用 strlen

使用 sizeof 计算数组长度(仅适用于字符数组)

sizeof 可以计算数组的总字节数,但要注意:

  • 仅适用于字符数组,不适用于指针(如 char *str = "Hello")。
  • 会包含 '\0',所以长度比 strlen 多 1。

示例代码

#include <stdio.h>
int main() {
    char str[] = "Hello, World!"; // 字符数组
    size_t length = sizeof(str) - 1; // 减去 '\0' 的长度
    printf("字符串长度: %zu\n", length);
    return 0;
}

输出:

字符串长度: 13

注意事项

  • str 是指针(如 char *str = "Hello"),sizeof(str) 返回的是指针大小(通常是 4 或 8 字节),而不是字符串长度。
  • 适用于静态定义的字符数组,不适用于动态分配的内存。

使用 wcslen 处理宽字符字符串

如果处理的是 wchar_t 类型的宽字符串(如 Unicode),应使用 wcslen(来自 <wchar.h>)。

示例代码

#include <stdio.h>
#include <wchar.h>
#include <locale.h> // 设置本地化环境
int main() {
    setlocale(LC_ALL, ""); // 支持宽字符输出
    wchar_t wstr[] = L"你好,世界!"; // 宽字符字符串
    size_t length = wcslen(wstr);
    printf("宽字符串长度: %zu\n", length);
    return 0;
}

输出(可能因系统编码不同而变化):

宽字符串长度: 6

方法 适用场景 是否包含 '\0' 备注
strlen 最常用,适用于以 '\0' 结尾的字符串 ❌ 不包含 标准库函数,推荐使用
手动遍历 学习或特殊需求 ❌ 不包含 功能等同于 strlen
sizeof 仅适用于静态字符数组 ✅ 包含 需手动减 1
wcslen 宽字符字符串(如 Unicode) ❌ 不包含 需要 <wchar.h>

推荐做法:

  • 优先使用 strlen,因为它简洁、高效且标准。
  • 如果字符串可能未正确终止(如从网络或文件读取),应先检查 '\0' 或使用安全的字符串函数(如 strnlen)。
-- 展开阅读全文 --
头像
dede tag颜色如何自定义修改?
« 上一篇 前天
C语言计算器如何实现多个数连续运算?
下一篇 » 前天
取消
微信二维码
支付宝二维码