C: gets () пропускает первый вход

#include  #include  #include  #include  typedef struct record { char name[20]; char surname[20]; char telephone[20]; }Record; typedef struct node { Record data; struct node *next; }Node; Node *head = NULL; void addRecord(Record s) { Node *newNode; Node *n; newNode = (Node*)malloc(sizeof(Node)); newNode->data = s; newNode->next = NULL; if (head == NULL) { // The linked list is empty head = newNode; } else { // Traverse the whole list until we arrive at the last node n = head; while (n->next != NULL) { n = n->next; } n->next = newNode; } } Record enterRecordDetails() { Record aRecord; int len; int valid = 0; int valid2 = 0; printf("ENTER THE FOLLOWING RECORD DETAILS:\n"); printf(" NAME : "); gets(aRecord.name); printf(" SURNAME : "); gets(aRecord.surname); do { valid = 0; valid2 = 0; printf(" TELEPHONE NO. (8 digits): "); gets(aRecord.telephone); len = strlen(aRecord.telephone); for (int i = 0; i next; for (; next; p = next, next = next->next) { if (strcmp(p->data.telephone, aRecord.telephone) == 0) { valid2 = 1; break; } } if(p = NULL)break; } } while((valid == 1) || (len != 8) || (valid2 == 1)); getchar(); fflush(stdin); return aRecord; } int main(void) { char menuOption; do { system("cls"); printf("~~~ MAIN MENU ~~~\n"); printf("1. Add Telephone Record\n"); printf("2. Delete Telephone Record\n"); printf("3. Search\n"); printf("4. Display All Records\n"); printf("5. Exit\n\n"); menuOption = getchar(); fflush(stdin); switch (menuOption) { case '1': addRecordToList(); break; case '4': displayList(); break; } } while (menuOption != '5'); getchar(); return 0; 

}

При добавлении ученика компьютер просит пользователя ввести фамилию, а не имя. Почему программа пропускает «Имя»? Отображается «Имя», однако ожидается, что пользователь напишет фамилию.

Во-первых, не используйте gets , это небезопасно. Вместо этого используйте fgets .

Причина, по которой первый вызов gets пропускает строку, заключается в том, что в буфере есть '\n' в то время, когда вы делаете вызов enterRecordDetails() . Как правило, '\n' остается в стороне от более ранней операции ввода, например, от чтения int с помощью scanf .

Один из способов устранить эту проблему – прочитать строку до конца при чтении int , чтобы последовательный вызов fgets получал фактические данные. Вы можете сделать это в своей функции enterRecordDetails() :

 Record enterRecordDetails() { Record aRecord; printf("ENTER THE FOLLOWING RECORD DETAILS:\n"); printf(" NAME : "); fscanf(stdin, " "); // Skip whitespace, if any fgets(aRecord.name, 20, stdin); printf(" SURNAME : "); fgets(aRecord.surname, 20, stdin); } 

Обратите внимание, однако, что fgets сохраняет '\n' в строке, если она помещается в буфер. Лучшим подходом будет использование scanf и передача спецификатора формата, который ограничивает длину ввода и останавливается в '\n' :

 scanf(" %19[^\n]", aRecord.name); // ^