【问题标题】:Dynamically allocated 3d array with unknown parameters具有未知参数的动态分配的 3d 数组
【发布时间】:2022-01-07 14:14:54
【问题描述】:

我的任务是从文件中获取输入。输入看起来像下面的示例。为了使用它,我必须存储未知数量的行,并且我必须能够一一获取它们,并且在每行中存储未知数量的单词,以便我以后可以访问它们。

输入示例:

U a b c x y z
S a b c x
S x y z
S x
S a b c

我的第一个想法是创建一个 3 维数组,它看起来像这样:char arr[number of rows][number of words][maximum length of a word = 30] 这样我就可以很容易地访问它们。

我遇到的问题是我必须动态分配它,正如我所说,行数和每行中的单词数因每个输入文件而异。

我不确定如何动态分配它。也许一些不同的方法会更有效。这正是我想出的。

【问题讨论】:

  • 避免添加图片也正确排序问题。
  • 如果每行的项目数量不同,则 3D 数组不太适合,因为它会占用大量额外内存。看起来你应该创建一个包含指针数组和大小的结构的系统。

标签: c multidimensional-array file-handling


【解决方案1】:

如果你对每行的字数有一些限制,实现会容易得多。

例如,

#define MAX_WORDS_PER_ROW 50 
#define MAX_CHARS_PER_WORD 30 //provided in question

你可以有一个代表一行的结构,即

typedef struct row {

char[MAX_WORDS_PER_ROW][MAX_CHARS_PER_WORD] words;
int num_words;

} row;

然后您可以计算每个文件中的行数

int num_rows = 0;
char line[1024];
while(fgets(line,sizeof(line),file)){
    num_rows++;
} 

最后,您可以创建一个大小与行数完全一致的数组

row* rows = malloc(sizeof(row)*num_rows);

之后,您可以逐行解析文件并填充rows 数组。您可能需要使用fseek 将文件指针移回起点。退出前不要忘记释放rows 数组。

如果您对每行的字数没有任何上限,这可能需要嵌套的动态内存分配,这可能会非常令人头疼并导致内存泄漏。

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 2014-04-20
    • 2010-12-21
    • 2019-07-19
    • 1970-01-01
    • 2017-02-25
    • 2011-01-27
    • 1970-01-01
    • 2015-11-17
    相关资源
    最近更新 更多