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
相关产品推荐
相关产品推荐

