You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何获取char**类型数据每一行的长度?

C语言获取多行字符串每行长度的实现方案

首先纠正一个基础认知:你给出的示例代码里arr不是char**类型,是char*类型。C语言编译阶段会自动拼接相邻的字符串字面量,最终arr指向一整块以\0结尾的连续内存,行与行之间仅靠\n字符分隔。这种情况下sizeof(arr)拿到的是指针本身的存储长度(64位系统为8字节,32位系统为4字节),strlen(arr)拿到的是整个字符串的总长度,自然无法直接得到单行长度。

处理char*指向的、以\n分隔的多行字符串

这种场景不需要使用malloc/realloc做动态内存分配,直接遍历字符串按\n切分统计即可:

  • 用指针记录当前行的起始位置,从头开始逐字符遍历
  • 遇到\n时,用当前遍历位置减去行起始指针,得到当前行的长度(不含\n本身)
  • 把行起始指针移到\n的下一个字符,继续遍历
  • 遇到字符串结尾的\0时,补算最后一行的长度,结束遍历

对应实现代码:

#include <stdio.h>

int main() {
    const char* arr = "x    xxxx\n"
                      "x xx\n"
                      "x  xxx\n";
    const char* line_start = arr;
    int line_idx = 0;

    for (const char* p = arr; ; p++) {
        if (*p == '\n' || *p == '\0') {
            int line_len = p - line_start;
            printf("第%d行长度:%d\n", line_idx, line_len);
            line_idx++;
            if (*p == '\0') break;
            line_start = p + 1;
        }
    }
    return 0;
}

上述代码跑你提供的示例,输出结果为:

第0行长度:9
第1行长度:4
第2行长度:5

和每行实际长度完全匹配。

处理真正的char**类型字符串数组

如果变量确实是char**类型,它本质是指向字符指针数组的指针,数组中每个元素都是一个独立的char*,指向单独的一行字符串。这种情况获取行长非常简单:遍历数组中每个指针元素,对每个指针调用strlen即可得到对应行的长度。
需要注意的是,char**本身不携带数组长度信息,你需要提前知道数组元素总数,或者在数组末尾放置一个NULL指针作为结束标记(和argv参数、环境变量数组的规则一致)。
对应实现代码:

#include <stdio.h>
#include <string.h>

int main() {
    // 构造char**类型字符串数组,末尾放NULL标记结束
    const char* line_buf[] = {"x    xxxx", "x xx", "x  xxx", NULL};
    const char** arr = (const char**)line_buf;

    for (int i = 0; arr[i] != NULL; i++) {
        int line_len = strlen(arr[i]);
        printf("第%d行长度:%d\n", i, line_len);
    }
    return 0;
}

动态内存的适用场景

malloc/realloc只在你需要持久化存储每行长度、或者把每行内容单独拷贝留存后续使用时才需要用到。比如你想把所有行的长度存到一个int数组里反复读取,可以在第一次遍历得到总行数后,申请对应大小的内存存储结果;如果只是临时计算一次长度直接使用,完全没必要做动态内存分配,避免额外的内存管理开销和泄漏风险。

内容的提问来源于stack exchange,提问作者Colin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:15:42