You can write the mygets() utility function, which takes 2 arguments: a pointer to the target array and its size:
char *mygets(char *dest, size_t size) { 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; } }
Note that you can decompose more code using the prompt() function, which displays the question and reads the answer:
char *prompt(const char *message, char *dest, size_t size) { printf("%s ", message); fflush(stdout); 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; } }
Also note that this function must take the size of the reg array in order to stop asking for more input when it is full. As currently indicated, it has the same drawback as gets() , unexpected input will cause undefined behavior.