也许只通过一次是最好的选择:读取值,并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++;
*/
}
您是否知道可以通过在您使用的格式说明符和您使用*
的任何格式说明符之间放置一个来告诉 scanf 丢弃输入%
?例如,assert(scanf("%*c") == 0);
将读取并丢弃没有赋值的字符,这反映在返回值上。