fgets печатает две строки перед вводом

Итак, я пытаюсь написать программу, которая позволит мне читать пользовательский ввод для данных в файле MP3, используя структуру данных с двойным связным списком. У меня работает большинство методов и функций, но когда я предлагаю пользователю ввести данные, он выводит две строки, прежде чем пользователь сможет ввести первую строку. Так например

int main()
{
    int user_input = 0;

    while(!(user_input >= 4))
    {
            struct MP3_data_node* MP3_data;
            MP3_data = (struct MP3_data_node*)malloc(sizeof(struct MP3_data_node));

            printf("\nPlease select a number for one of the following instructions:\n");
            printf("0: add to list\n1: delete from list\n2: print the list from beginning to end\n3: print the list from end to beginning\n4: exit\n");

            scanf("%d", &user_input);

            if(user_input == 0)
            {
                    printf("Please provide the artist:");
                    fgets(MP3_data->artist,50,stdin);
                    printf("Please provide the album:");
                    fgets(MP3_data->artist,50,stdin);
                    printf("Please provide the song title:");
                    fgets(MP3_data->artist,50,stdin);
                    printf("Please provide the year the song was released: ");
                    scanf("%d", &MP3_data->yearReleased);
                    printf("Please provide the length of the song in seconds: ");
                    scanf("%d", &MP3_data->runTime);

                    addToList(MP3_data);
            }
...

Итак, он распечатывает «Пожалуйста, укажите исполнителя: Пожалуйста, укажите альбом:», а затем позвольте мне ввести ввод, поэтому мой вопрос в том, как мне сделать так, чтобы он печатался: Пожалуйста, укажите исполнителя: (пользовательский ввод) Пожалуйста, предоставьте альбом: (пользовательский ввод) и т. д.


person JoeSpit    schedule 19.09.2013    source источник


Ответы (1)


Вы делаете правильно (fgets) в первых нескольких подсказках, затем переключаетесь на scanf, который является источником вашей проблемы. Используйте fgetsstrtol) вместо scanf и все будет в порядке. (И первый scanf, который вызывает проблему, описанную в вашем вопросе.)

Проблема в том, что scanf только читает цифровую часть того, что вы вводите. Это означает, что если вы нажмете 12Enter, то scanf прочитает 1 и 2, но оставит Enter во входном буфере для следующего вызова. до fgets или scanf. С другой стороны, fgets читает все, что вы вводите, включая Enter, избегая этой проблемы.

person Greg Hewgill    schedule 19.09.2013