2014-01-29 3 views
1

Я пытаюсь использовать fgets для получения пользовательского ввода из командной строки. Фрагмент кода является частью функции, которая позволяет пользователям добавлять новые узлы в односвязный список. Как вы можете видеть из моего кода, я использую цикл while для запроса запроса от пользователя (чтобы он мог добавить несколько узлов). Когда я запускаю программу, все в порядке в первый раз. Однако, когда я пытаюсь добавить второй узел, программа пропускает запрос ввода для поля первого имени. В моей командной строке, я получаю имя: Фамилия:C: fgets пропускает ввод пользователя

while (go) 
{ 
    char first_name[256]; 
    char last_name[256]; 
    char telephone[256]; 
    char address[256]; 

    printf("First name: "); 
    fflush(stdout); 
    fgets(first_name, sizeof(first_name), stdin); 
    //scanf("%s", &first_name); 
    fflush(stdin); 

    printf("Last name: "); 
    fflush(stdout); 
    fgets(last_name, sizeof(last_name), stdin); 
    fflush(stdin); 
    //scanf("%s", &last_name); 

    printf("Address: "); 
    fflush(stdout); 
    fgets(address, sizeof(address), stdin); 
    fflush(stdin); 
    //scanf("%s", &address); 

    printf("Telephone: "); 
    fflush(stdout); 
    fgets(telephone, sizeof(telephone), stdin); 
    fflush(stdin); 
    //scanf("%s", &telephone); 

    if (!search_by_all(first_name, last_name, address, telephone)) 
    { 
     add_entry(first_name, last_name, address, telephone); 
     printf("Success adding entry! Add another entry? 1 for yes, 0 for no.\n"); 
     scanf("%d", &go); 
     fflush(stdin); 
     fflush(stdout); 
    } 
    else 
    { 
     printf("Error adding entry. Quitting...\n"); 
     break; 
    } 
} 

Я смотрел на подобные вопросы на StackOverflow и других сайтах, но промывка и стандартный ввод стандартный вывод не сделать трюк для меня. Также не выделяет больше места в моих буферах. Какие-либо предложения? Благодаря!

+2

Почему 'fflush (stdin)'? Разве это не неопределенное поведение, по крайней мере, на большинстве платформ? –

+0

не использовать 'fflush (stdin);' если вы не используете компилятор Microsoft –

+0

возможный дубликат [Почему fgets не вводит первое значение?] (Http://stackoverflow.com/questions/20092468/why-fgets- is-not-ввод-first-value) – Barmar

ответ

1

Смешивание scanf() и fgets() проблематично.

Предложить всех fgets() и проверить результаты.

// scanf("%d", &go); 
char buf[sizeof(go)*3 + 3]; 
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_EOF(); 
if (sscanf(buf, "%d", &go) != 1) Handle_BadInput; 

Типичное использование scanf() оставляет Введите или '\n' в stdin. Последующий вызов fgets() затем возвращает только"\n".

Примечание: Уверены все вхождения fflush(stdin); могут быть удалены.

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