C 第一次 fgets() 在第二次运行时被跳过

C first fgets() is being skipped while the second runs

问题是:

为什么第一个 fgets 语句被跳过? 我在某处读到这可能是因为我之前使用过的 SCANF()。 我想弄清楚,但我做不到。 有人可以给我解决方案吗(我可能应该重写第一段代码以避免 scanf,但是怎么做呢?)。

这是我正在努力处理的代码:

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] = '[=10=]';

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

这是因为最后的 ENTER 按键,导致 newline 留在输入缓冲区中。这是第一个 fgets().

拾取的

您可以在第一个 fegts() 之前添加一个 while(getchar() != '\n'); 来避免这种情况。

[编辑: 或者,为了更好,正如 Chux 所提到的 感谢他 在下面的评论中,使用类似

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

处理 'newline' 以及 EOF。]

也就是说,混合使用 scanf()fgets() 从来都不是一个好的选择。始终使用 fgets(),这是可能的,而且更好。

只需更改

scanf(" %c" ,&type);

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

第一个 fgets 被跳过的原因是您的 scanfstdin 中留下了换行符。 fgets 看到这个字符并使用它,因此不等待进一步的输入。

%*c 告诉 scanf 读取并丢弃一个字符。

是的,这是因为您的 scanf() 只读了一个字符,但用户按下了 return。 return 保留在输入缓冲区中,因此 fgets() 立即看到它并且 returns.

不要混用,只用fgets()