我只是想知道我究竟是怎么回事。我知道我应该使用malloc
,但我仍然不确定如何解决这个问题。
编辑:我意识到我实际想要使用的功能是realloc
我想分配的每一行都会有不断变化的大小,我还想在程序代码进行过程中添加更多行。
如果您想知道原因,我正在开展一个项目,其中我读了一个.txt
文件然后打印出来,出现次数最多的单词以及数字外表。
答案 0 :(得分:2)
对于想要读取行文件的情况,我建议您使用行的链接列表而不是行数组,因为您可以通过保持指向最后一个元素的指针轻松追加到链接列表(自己解决这个问题)。如果愿意,您可以稍后将该链接列表转换为数组。
您还可以尝试计算文件的长度,并一次性为整个文件分配所有空间(然后可能一次读取整个文件),这样您就不必重新分配每时每刻。再次,自己解决细节。
对于您的特定问题,您实际上根本不需要将文件读入内存!您可以将单词与trie或类似数据结构中的出现次数一起保存,并保持到目前为止具有最高计数的单词的链接。这并不是很复杂,但细节超出了这个问题的范围。
答案 1 :(得分:0)
根据程序的动态行为,我有几个想法。
首先,您可以考虑链接列表而不是数组。这将使删除和添加元素变得非常容易。如果要减少行数,首先必须删除行中的所有元素,然后删除行元素本身。
使用链接列表的2D矩阵:
[[_]] -> [[_]] -> [[_]] -> [[_]] -> [[_]]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
| | | | |
v v v v v
[_] [_] [_] [_] [_]
其次,如果您通常只有 ADD 元素,那么您的行可以类似地表示C ++向量。使用内部变量创建每个行/行以跟踪填充级别。如果结构变满,则重新分配更大的尺寸(有一个说“尺寸加倍”的来源是一种很好的通用方法)。
可以用来代替链表的数据结构(至少在一行内):
struct d_array(){
int fillevel, size;
void* memory;
}
这个数据结构需要在每次插入之前检查一些函数,如果它已满并根据需要重新分配。缩小比较困难,你可以尝试定期清理。通常,您不希望过于急切地缩小,因为稍后可能需要再次使用该空间(如果您的行再次增长)。
答案 2 :(得分:0)
如果你想知道为什么,我正在做一个项目,我 读取.txt文件,然后打印出具有最高编号的单词 外观,以及出场次数。
您不需要多维数组。文本按顺序存储,新行使用\n
字符表示。
但是你还需要一些像地图一样的关联容器,以便在解析文本文件时在其中存储唯一的单词。
在“伪代码”中:
for the entire text
parse a word
if word is not in the map insert it with count one
else find and increment the word's count
find the word with higher count value
不幸的是,C没有附带地图容器,您必须自己find one或自己写一个,这可能仍然不在您的编程能力范围内。
对于单词的解析,您可以创建一个字符数组,表示有效的文本字符,如AaBbCcDd...
,并为文本的每个字符检查它是否包含在该数组中。如果它被包含而前一个不是(或者这是第一个字符)你注册了一个单词开头的索引,如果它没有被包含,而之前你有一个是,那么你标记单词的结尾,从索引范围中提取单词并继续在地图中更新它。依此类推,直到你到达文本末尾。
最后但并非最不重要的是,地图实际上是可选的。您也可以将单词条目存储为常规数组中char * word
和int count
的结构,但在很多单词的情况下,查找性能可能会很差,因为它会涉及大量的字符串比较,而地图将散列字符串并查找整数而不是字符串。