当我运行以下代码时:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
char y;
printf("Message\n");
fscanf(stdin, "%c", &y);
printf("Message\n");
fscanf(stdin, "%c", &y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
Message
{enter character}
Message
Run Code Online (Sandbox Code Playgroud)
问题是,即使有2个scanf函数,也不会要求我输入两次字符.输出应该是这样的:
Message
{enter character}
Message
{enter character}
Run Code Online (Sandbox Code Playgroud)
我也有这个问题getc()
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
char y;
printf("Message\n");
y=getc(stdin);
printf("Message\n");
y=getc(stdin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另外,fflush()
没有帮助:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
char y;
printf("Message\n");
y=getc(stdin);
fflush(stdin);
fflush(stdout);
printf("Message\n");
y=getc(stdin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图fflush stdin,stdout,stdin + stdout(同时),但结果仍然相同.
更改
fscanf(stdin, "%c", &y);
Run Code Online (Sandbox Code Playgroud)
至
fscanf(stdin, " %c", &y);
Run Code Online (Sandbox Code Playgroud)
引用C11标准:
7.21.6.2 fscanf函数
[...]
- 由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止.该指令永远不会失败.
所以,之前的空间%c
丢弃\n
了第一个留下的角色fscanf
.这个角色来自哪里?回想一下,enter输入字符后按键.第一个字符不会占用此字符,而是fscanf
保留在标准输入缓冲区(stdin
)中.
这也发生在程序的第二个版本中,即第二个版本getc
获得第一个版本留下的换行符.您可以使用以下代码刷新(清除)stdin
:
int c;
while((c=getchar())!=EOF && c!='\n');
Run Code Online (Sandbox Code Playgroud)
至于为什么不fflush(stdin);
工作是标准说行为是未定义的:
7.21.5.2 fflush功能
[...]
- 如果流指向输入流或未输入最近操作的更新流,则fflush功能会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义.
但请注意,在某些实现中fflush(stdin)
确实有效.还读这个