Помимо того, что уже было сказано о том, как хранить результирующие данные, есть также сторона анализа входных данных.
Для вашей конкретной цели (используйте only <stdio.h>
), вынужно сделать что-то вроде:
struct sale *s;
for (s = sales; !feof(stdin); s++) {
if (fscanf(stdin, "%4u %2u %2u %f\n",
&s->year, &s->month, &s->day, &s->total) != 4) {
error("Parsing error on <stdin>");
}
if (!date_is_valid(s))
error("Invalid date given");
}
Но обработка ошибок / обнаружение недопустимого формата проще, если использовать существующие функции, предназначенные для этой цели:
Стандарт C (UN * X / POSIX,скорее), имеет функцию strptime()
(в <time.h>
, которая является стандартным включаемым файлом) для этой цели.Преимущество использования этого вместо того, чтобы переходить по собственному усмотрению, состоит в том, что он может анализировать широкий спектр форматов, проверять правильность даты (вы знаете, например, смешивания месяца / дня, которые происходят при работе с американскими и европейскими клиентами) и возвращает вам дату вчасто используемые структуры данных (struct tm
).
Это другая тема, хотя ...