gpt4 book ai didi

c - 在动态字符串数组中存储文本文件数据的优雅方法

转载 作者:行者123 更新时间:2023-11-30 14:47:24 29 4
gpt4 key购买 nike

我正在构建一个文件文本解析器,其中的字符串以某种方式格式化。它们都以 \n 字符结尾。

我需要构建一个包含每一行的字符串数组。我希望以最少的变量使用实现最大的动态性,因此动态数组不会有初始大小,但它将通过 realloc 进行扩展。

我的问题是,每当我从文件中读取某个“停止”字符串时,我都需要停止,并且我不知道到底在哪里放置此检查,或者如何在其中进行检查最优雅的方式。这是我的想法:

char * temp = malloc(STRLEN * sizeof(char)); //temporary string
int i = 0, size = 1; //i=strArray pointer, size=strArray size
char ** strArray = malloc(size * sizeof(char*)); //array of strings
strArray[i] = (char *)malloc(STRLEN+1);
strcpy(temp ,strArray[i]);
while(strcmp(temp,"stop\n")!=0)
{
fgets(temp,STRLEN,fp);
strcpy(trArray[i],temp);
i++;
size++;
trArray = realloc(trArray, size * sizeof(char*));
trArray[i] = (char *)malloc(STRLEN+1);
}

我对该算法的担忧有两个:

  1. 我需要使用临时 temp 字符串,然后使用 strcpy 复制内容
  2. 最后,我仍然保存了“停止”,但我不想这样做,并又分配了一个空间。

基本上我的问题是我不知道如何正确迭代这个数组。我做错了什么,我可以改进什么?

最佳答案

当您从文件中读取时,您可以计算数组的大小,然后根本不使用 realloc。可以这样完成:

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

#define BUFFSIZE 1024

int get_size(void)
{
int nlines = 0;
char line[BUFFSIZE];
FILE *fptr = fopen("t1.txt","r");

while(fgets(line, BUFFSIZE, fptr) != NULL) {
nlines++;
}

fclose(fptr);
return nlines;
}

char **init(int size)
{
int i;
char **tmp;

tmp = malloc(sizeof(char*) * (size + 1)); //array of strings

for(i = 0; i < size; ++i)
tmp[i] = malloc(sizeof(char) * (BUFFSIZE + 1));
tmp[i] = NULL;

return tmp;
}

int main(void)
{
char *temp;
char **strArray;
int pos = 0;
int size = 0;
ssize_t tmp_size;
FILE *fptr;

strArray = init(get_size());

fptr = fopen("t1.txt", "r");
do {
if (getline(&temp, &tmp_size, fptr) == -1) {
free(temp);
break;
}

temp[strcspn(temp, "\n")] = 0;
strcpy(strArray[pos++], temp);
} while (strcmp(temp, "stop"));

fclose(fptr);
printf("%s\n", strArray[0]);
printf("%s\n", strArray[1]);

return 0;
}

我的文本文件内容是:

hello
world
stop
earth
bye

输出是:

hello
world

当然是一个示例,它应该根据您的需要进行优化(错误检查、可用内存等),我将其留给您。

关于c - 在动态字符串数组中存储文本文件数据的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51294693/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com