Вы можете написать служебную функцию mygets()
, которая принимает 2 аргумента: указатель на массив назначения и его размер:
char *mygets(char *dest, size_t size) {
/* read a line from standard input and strip the linefeed if any */
if (fgets(dest, size, stdin)) {
dest[strcspn(dest, "\n")] = '\0');
return dest;
}
return NULL;
}
void regCars(Car reg[], int *pNrOfCars) {
char model[WORDLENGTH], tmp[WORDLENGTH];
int year, milage;
for (;;) {
printf("Enter model:");
if (!mygets(model, sizeof mode))
break;
printf("Enter year:");
if (!mygets(tmp, sizeof tmp))
break;
year = atoi(tmp);
printf("Enter milage:");
if (!mygets(tmp, sizeof tmp))
break;
milage = atoi(tmp);
reg[*pNrOfCars] = createCar(model, year, milage);
(*pNrOfCars)++;
printf("Continue? (yes/no)");
if (!mygets(tmp, sizeof(tmp))
break;
if (strcmp(again, "yes") != 0)
break;
}
}
Обратите внимание, что вы можете факторизуются больше кода с prompt()
функции, которая выводит вопрос и читает ответ:
char *prompt(const char *message, char *dest, size_t size) {
printf("%s ", message);
fflush(stdout);
/* read a line from standard input and strip the linefeed if any */
if (fgets(dest, size, stdin)) {
dest[strcspn(dest, "\n")] = '\0');
return dest;
}
return NULL;
}
void regCars(Car reg[], int *pNrOfCars) {
char model[WORDLENGTH], tmp[WORDLENGTH];
int year, milage;
for (;;) {
if (!prompt("Enter model:", model, sizeof mode))
break;
if (!prompt("Enter year:", tmp, sizeof tmp))
break;
year = atoi(tmp);
if (!prompt("Enter milage:", tmp, sizeof tmp))
break;
milage = atoi(tmp);
reg[*pNrOfCars] = createCar(model, year, milage);
(*pNrOfCars)++;
if (!prompt("Continue? (yes/no)", tmp, sizeof(tmp))
break;
if (strcmp(again, "yes") != 0)
break;
}
}
также отметить, что эта функция должна принимать размер reg
массив, чтобы прекратить запрашивать больше ввода, когда он заполнен. Как указано в настоящее время, он имеет тот же самый недостаток, что и gets()
, неожиданный ввод приведет к неопределенному поведению.
@Alex: вы не возражаете против голосования, который вы приняли? – chqrlie