C - 得到角色问题

web*_*nce 2 c codeblocks

当我运行以下代码时:

#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(同时),但结果仍然相同.

Spi*_*rix 5

更改

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函数

[...]

  1. 由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止.该指令永远不会失败.

所以,之前的空间%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功能

[...]

  1. 如果流指向输入流或未输入最近操作的更新流,则fflush功能会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义.

但请注意,在某些实现中fflush(stdin) 确实有效.还读这个