おそらく、1 つのパスを作成するのが最良のオプションです。値を読み取り、realloc
必要に応じて を使用して配列のサイズを変更します。膨大な量の入力によるエラーの可能性を最小限に抑えるには、問題を解決するために必要な情報のみを保存する必要があります。出力が月に基づく場合は、月に基づいて情報を収集します。例えば:
size_t count = 0;
struct month_stat *month = NULL;
while (count <= SIZE_MAX / sizeof *month &&
scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f",
&yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki,
&latit, &longi, &depth, &magnitude) == 13)
{
/* resize based upon powers of two for simplicity */
if (count & (count - 1) == 0)
{
void *temp = realloc(month, (count * 2 + 1) * sizeof *month);
if (temp == NULL)
{
/* handle error */
}
month = temp;
}
/* TODO: Update month[count] and overall stats
* When the month changes, you'll want to count++;
*/
}
*
と の間に a を配置することで入力を破棄するように scanf に指示できることをご存知%
ですか? たとえば、assert(scanf("%*c") == 0);
割り当てなしで文字を読み取って破棄すると、戻り値に反映されます。