根据您的描述,您希望struct
每段一个实例。因此,每次遇到换行符时,您都想开始一个新的段落计数。
首先动态分配初始数量的Paragraph
对象(足以涵盖大多数情况),然后根据需要扩展该块:
#define INITIAL_SIZE ... // some initial value, say 5 or 10
...
size_t numParas = 0; // keep track of the array size
size_t parasRead = 0; // keep track of the paragraphs read
...
struct Paragraph *paras = malloc(sizeof *paras * INITIAL_SIZE);
if (paras)
{
numParas = INITIAL_SIZE;
}
else
{
perror("Could not allocate initial memory...exiting");
exit(-1);
}
... // open the file and read input
while (more_data)
{
int c = fgetc(input);
// update the various fields of paras[parasRead]
// based on the value of current_character
if (c == '\n')
{
// ready to start a new paragraph. If we've reached the end
// of the paras array and don't have a new slot available,
// extend the array by doubling its size
if (parasRead + 1 == numParas)
{
struct Paragraph *tmp = realloc(paras, sizeof *paras * (numParas * 2));
if (tmp)
{
paras = tmp;
numParas *= 2;
}
else
{
perror("Could not extend the paras array...exiting");
free(paras);
exit(-1);
}
}
parasRead++;
moreData = (c != EOF);
}
}
// display results
...
free(paras);
这至少应该让你开始。realloc
如果无法扩展缓冲区,您将不得不决定该怎么做。在上面的示例代码中,我将其视为致命错误并立即退出,但您可以尝试将缓冲区扩展较小的量(而不是加倍,将其增加 1.5 倍,如果失败则增加 1.25 倍,等等) . 您可以决定退出循环并展示您的结果。或者完全不同的东西。
可能还有更好的组织方式;最好将数组管理代码分离到一个单独的函数中。但这应该让您了解所需的内容。