's'
не требуется: scanf("%31s[^\n]", coolname.firstName);
пытается прочитать ввод без пробелов до 31 символа, а затем прочитать [, ^ , любые пробелы , ] .
Конечно, нет- 's'
на один шаг лучше: scanf("%31[^\n]"...
, поскольку он попытается прочитать до 31 не-1015 * символов.
Тем не менее, это не будет использовать трейлинг '\n'
.
Рекомендовать читать все пользовательские вводы с fgets()
.Возможно, в качестве вспомогательной функции.
int read_line(const char *prompt, char *dest, size_t n) {
fputs(prompt, stdout);
fflush(stdout);
dest[0] = '\0';
char buf[n*2 + 2];
if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
size_t len = strlen(buf);
if (len > 0 && buf[len - 1] == '\n') { // lop off potential \n
buf[--len] = '\0';
}
if (len >= n) { // maybe add a `len == 0` test
return 0; // indicate invalid input,
}
strcpy(dest, buf);
return 1;
}
Теперь используйте вспомогательную функцию
if (read_line("Please enter the contact's first name: ", coolname.firstName, sizeof coolname.firstName) == 1) {
// Oh happy day, got first name
}
if (read_line("Please enter the contact's middle name: ", coolname.middleInitial, sizeof coolname.middleInitial) != 1)) {
// Oh happy day, got middle name
}
if (read_line("Please enter the contact's last name: ", coolname.lastName, sizeof coolname.lastName) != 1)) {
// Oh happy day, got last name
}