C第一个fgets()被跳过,而第二个运行

时间:2015-06-08 10:46:25

标签: c fgets

问题是:

为什么跳过第一个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] = '\0';

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

处理'换行符'以及EOF。]

尽管如此,混合scanf()fgets()绝不是一个好的选择。始终使用fgets(),这是可能的,也是更好的。

答案 1 :(得分:1)

是的,这是因为你的scanf()读取的单个字符不多,但用户按下了返回。返回仍然在输入缓冲区中,因此fgets()会立即看到并返回。

请勿混用它们,仅使用fgets()

答案 2 :(得分:0)

只需更改

scanf(" %c" ,&type);

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

第一个fgets被跳过的原因是您的scanfstdin中留下了换行符。 fgets看到这个角色并消耗掉它,因此不等待更进一步的输入。

%*c告诉scanf阅读并弃掉角色。