问题是:
为什么跳过第一个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';
}
答案 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
被跳过的原因是您的scanf
在stdin
中留下了换行符。 fgets
看到这个角色并消耗掉它,因此不等待更进一步的输入。
%*c
告诉scanf
阅读并弃掉角色。