C语言创建动态长度字符串数组 如何替换固定行长数值10
解决方案
你现有写法里的二维可变长数组(VLA)仅支持第一维动态设置长度,第二维无法动态适配每行的不确定长度,且栈上分配的VLA遇到较大行计数时容易触发栈溢出。推荐改用堆上分配的指针数组配合动态行读取实现需求,具体逻辑如下:
实现思路
- 首先分配一个
char**类型的指针数组,数组长度为你提前统计到的行数lineCount,每个元素对应一行字符串的起始地址 - 读行时使用
getline函数(POSIX标准提供),该函数会自动根据行长度分配/扩容内存,无需手动预判行长度 - 读写完成后手动释放所有堆内存避免泄漏
可运行参考代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 假设你已经实现了linesCount函数,这里提供一个简单实现供参考 int linesCount() { int count = 0; char c; FILE* fp = fopen("test.txt", "r"); if (!fp) return 0; while ((c = fgetc(fp)) != EOF) { if (c == '\n') count++; } fclose(fp); return count + 1; // 最后一行无换行符的情况补1 } int main() { int lineCount = linesCount(); if (lineCount <= 0) { printf("文件为空或打开失败\n"); return 1; } // 分配指针数组,每个元素对应一行字符串 char** text = (char**)malloc(lineCount * sizeof(char*)); if (!text) { perror("内存分配失败"); return 1; } FILE* fpointer = fopen("test.txt", "r"); if (!fpointer) { perror("文件打开失败"); free(text); return 1; } size_t lineBufLen = 0; ssize_t readLen; int curLine = 0; // getline自动分配内存,无需提前指定行长度 while ((readLen = getline(&text[curLine], &lineBufLen, fpointer)) != -1 && curLine < lineCount) { // 可选:去掉末尾的换行符 if (readLen > 0 && text[curLine][readLen - 1] == '\n') { text[curLine][readLen - 1] = '\0'; } printf("第%d行内容:%s\n", curLine + 1, text[curLine]); curLine++; lineBufLen = 0; // 重置缓冲区长度,下一行重新分配 } fclose(fpointer); // 释放内存:先释放每一行的字符串内存,再释放指针数组 for (int i = 0; i < curLine; i++) { free(text[i]); } free(text); return 0; }
兼容标准C的替代方案
如果你的编译环境不支持getline,可以自己实现动态读行逻辑:先初始化一个固定长度(比如128字节)的缓冲区,每次读入字符如果缓冲区已满就调用realloc将缓冲区扩容一倍,直到读到换行符或文件结束为止。
内容的提问来源于stack exchange,提问作者Jip Helsen
相关产品推荐
相关产品推荐

