1

そのため、二重リンク リスト データ構造を使用して、MP3 ファイルのデータに対するユーザー入力を読み取るプログラムを作成しようとしています。ほとんどのメソッドと関数が機能するようになりましたが、ユーザーに入力を求めると、ユーザーが最初の行を入力できるようになる前に 2 行が出力されます。たとえば

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);
            }
...

「アーティストを提供してください: アルバムを提供してください:」と出力され、入力を入れましょう。私の質問は、それが印刷されるようにする方法です:アルバム: (ユーザー入力) など

4

1 に答える 1

1

あなたは正しいことをしています ( fgets) 最初のいくつかのプロンプトでscanfは、問題の原因となっているものに切り替えます。代わりにfgets(and ) を使用すると問題ありません。(そして、あなたの質問で説明されている問題を引き起こす最初のもの。)strtolscanfscanf

問題は、入力したものの数字部分scanf のみを読み取ることです。つまり、 を12Enter入力すると、 はand をscanf読み取りますが、 orの次の呼び出しのために入力バッファに を残します。一方、は、この問題を回避して、入力したものをすべて読み取ります。12EnterfgetsscanffgetsEnter

于 2013-09-19T04:46:31.083 に答える