説明に基づいて、struct
段落ごとに 1 つのインスタンスが必要です。したがって、改行文字に遭遇するたびに、新しい段落カウントを開始する必要があります。
オブジェクトの初期数を動的に割り当てることから始めて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
バッファを拡張できない場合の対処方法を決定する必要があります。上記のコード例では、これを致命的なエラーとして扱い、すぐに終了しますが、バッファーを少しだけ拡張することもできます (2 倍にする代わりに、1.5 倍に増やし、失敗した場合は 1.25 倍にするなど)。 . ループを終了して、得られた結果を提示することができます。または、まったく異なるもの。
これを整理するためのより良い方法もおそらくあります。配列管理コードを別の関数に分離することをお勧めします。しかし、これで何が必要かを理解できるはずです。