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
被跳过的原因是您的 scanf
在 stdin
中留下了换行符。 fgets
看到这个字符并使用它,因此不等待进一步的输入。
%*c
告诉 scanf
读取并丢弃一个字符。
是的,这是因为您的 scanf()
只读了一个字符,但用户按下了 return。 return 保留在输入缓冲区中,因此 fgets()
立即看到它并且 returns.
不要混用,只用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] = '[=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
被跳过的原因是您的 scanf
在 stdin
中留下了换行符。 fgets
看到这个字符并使用它,因此不等待进一步的输入。
%*c
告诉 scanf
读取并丢弃一个字符。
是的,这是因为您的 scanf()
只读了一个字符,但用户按下了 return。 return 保留在输入缓冲区中,因此 fgets()
立即看到它并且 returns.
不要混用,只用fgets()
。