-1

The question is:

Why does the first fgets statement is being skipped? I read somewhere that it might be because of SCANF() that I used before. I am trying to figure it out but I can't. Can someone give me the solution (I should probably re-write the first bit of code to avoid scanf, but how?).

This in the code I am struggling with:

for(;;)
    {
            //Ask if the user wants to add another CD - Y/N
            fputs("\nWould you like to enter new CDs details?  y or n\n", stdout);
            scanf(" %c" ,&type);
            if (toupper(type) != 'Y')
                break;

            puts("");


            //getting in the album information        
            printf("\tLets enter the details of the CD %d:\n\n", count + 1);


            fputs("Title?\n", stdout);   

            //this fgets statement is being skipped
            fgets(title[count], sizeof title[count], stdin);
            title[count][strlen(title[count]) - 1] = '\0';

            fputs("Atrist? \n", stdout);
            fgets(artist[count], sizeof artist[count], stdin);
            artist[count][strlen(artist[count]) - 1] = '\0';
    }
bartaspol
  • 33
  • 4

3 Answers3

3

This is because the last ENTER keypress, which causes a newline is left in the input buffer. This is picked up by the first fgets().

You can add a while(getchar() != '\n'); before the first fegts() to avoid this.

[EDIT: Or, for better, as mentioned by Chux Thanks to him in below comment,use something like

int ch; while((ch = getchar()) != '\n' && ch != EOF);

to handle the 'newline' as well as EOF.]

That said, it is never a good choice to mix scanf() and fgets(). Use fgets() always, it is possible and better.

Natasha Dutta
  • 3,242
  • 21
  • 23
1

Yes, it's because your scanf() didn't read more than a single character, but the user pressed return. The return remains in the input buffer, so fgets() immediately sees that and returns.

Don't mix them, use only fgets().

unwind
  • 391,730
  • 64
  • 469
  • 606
0

Simply change

scanf(" %c" ,&type);

to

scanf(" %c%*c" ,&type);

The reason that the first fgets gets skipped is that your scanf leaves a newline character in the stdin. fgets sees this character and consumes it, thus not waiting for furthur input.

The %*c tells scanf to read and discard a character.

Spikatrix
  • 20,225
  • 7
  • 37
  • 83