Ваш gets
вызов небезопасен. Он может принять больше символов, чем вы выделили. Бум.
Предполагая, что вы выделили не менее 8 байтов для .idCard
(т.е. 7 символов плюс терминатор), рассмотрите возможность использования этого:
fgets(newRes.idCard, 7+1, stdin);
Это гарантирует, что вы не примете слишком много символов. Он будет обрезан по мере необходимости. Проверьте возвращаемое значение fgets
на успешность.
(man fgets
)
Скомпилируйте этот пример кода и изучите. Надеюсь, вы найдете здесь то, что ищете.
#include <stdio.h>
#include <string.h>
#define MAX_ID_LEN (7)
int main() {
char idCard[MAX_ID_LEN+1];
printf("ID: ");
if (fgets(idCard, MAX_ID_LEN+1, stdin)) {
char *cLast = idCard + strlen(idCard)-1;
if (*cLast == '\n')
*cLast = 0; // strip newline *if* present
printf("Success! idCard='%s'\n", idCard);
} else {
printf("Failure.\n");
}
return 0;
}
Обратите внимание, что там есть несколько строк кода, чтобы проверить, содержит ли ввод символ новой строки, и удалить его. fgets
обеспечивает новую строку, если пользователь не ввел более 7 символов для идентификатора. Я надеюсь, что это ясно для вас.
В качестве альтернативы, это, вероятно, меньше отвлекает вас: (просто используйте fscanf
)
#include <stdio.h>
int main() {
char idCard[7+1];
printf("ID: ");
fscanf(stdin, "%7s", idCard);
printf("idCard='%s'\n", idCard);
return 0;
}
person
Darren Stone
schedule
23.12.2013
fflush(stdin)
. Это незаконно и вызывает неопределенное поведение! - person Fiddling Bits   schedule 23.12.2013gets()
в заголовках реализации и закомментировать его. Это настолько мерзко и зло, что язык устарел и больше не будет поддерживаться в будущих версиях. Вместо этого используйтеfgets()
. - person WhozCraig   schedule 23.12.2013