2016-09-17 2 views
1

Я новичок в C и люблю изучать его до сих пор, однако я столкнулся с проблемой с моей программой, с которой мне трудно работать выяснить. В приведенной ниже программе, если пользователь вводит «1», тогда им будет предложено ввести «Ключ», «Возраст», «Имя» и «Фамилия». Однако, когда пользователь вводит «1», программа не ждет ввода пользователем значения «Ключ» и вместо этого печатает прямо на «Возраст».C Программа не ждет ввода пользователем значения

Выход после входа в «1»:

Введите следующую информацию: Key: Возраст:

Программа не ждет пользователя, чтобы войти в значение ключа, прежде чем просить пользователю ввести значение возраста. При создании программы ошибок и предупреждений не возникает.

Любая помощь очень ценится.

typedef struct userInputsContainer { 
    char inputOption[2]; 
    char inputKey[2]; 
    char inputAge[3]; 
    char inputFName[10]; 
    char inputLName[10]; 
}userInputsContainer; 

int main() 
{ 
    struct userInputsContainer* container = (struct  userInputsContainer*)malloc(sizeof(userInputsContainer)); 

    printf("List of options..\n"); 
    printf("1.Create Entry\n2.Search Entries\n"); 
    fgets(container->inputOption, sizeof(container->inputOption), stdin); 

    if(container->inputOption[0] == '1') 
    { 
     printf("\nEnter the following information.. \n"); 

     printf("Key: "); 
     fgets(container->inputKey, sizeof(container->inputKey), stdin); 
     printf("Age: "); 
     fgets(container->inputAge, sizeof(container->inputAge), stdin); 
     printf("First Name: "); 
     fgets(container->inputFName, sizeof(container->inputFName), stdin); 
     printf("Last Name: "); 
     fgets(container->inputLName, sizeof(container->inputLName), stdin); 
    } 
} 
+1

@ пользователь3121023 нет необходимости хранить символ. А как насчет пустых строк? – Olaf

ответ

0

Для первого входа, когда вы читаете в container->inputOption, массив inputOption имеют достаточно места, чтобы соответствовать одному символу и строка терминатор. Проблема заключается в том, что fgets обычно хочет прочитать новую строку после ввода, а также добавить ее в буфер. Если в буфере нет места, то здесь fgets просто не будет читать новую строку и оставить ее во входном буфере. Поэтому следующий звонок fgets будет читать эту новую строку как первый символ и думать, что он читает всю строку и возвращается, не читая ничего больше.

В решении этой проблемы в основном два решения. Во-первых, это увеличение размера массива container->inputOption от двух до трех символов, поэтому оно будет соответствовать новой строке.

Второе решение - иметь цикл после первого вызова fgets, который считывает и отбрасывает символы до тех пор, пока не прочитает новую строку.

+0

Большое спасибо за объяснение, я определенно узнал что-то новое! Это решило мою проблему! –

Смежные вопросы