fflush()函数不能与stdin一起使用

har*_*nja 1 c stdin fflush

对不起这个愚蠢的问题我很抱歉.我有C程序提示用户输入年龄和名称,然后将年龄和名称打印到屏幕上.这是我从书中读到的练习.

这个程序:

#include <stdio.h>

int main (void) {
   int age;
   char name[20];

   puts("Enter your age:");
   scanf("%d",&age);

   fflush(stdin);

   puts("Enter your name:");
   scanf("%s",name);

   printf("Your age is %d\n",age);
   printf("Your name is %s\n",name);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我向第一个输入额外的字符时,scanf()程序终止并将额外的字符分配给下一个scanf()

然后我更改了代码,并添加了命名函数clear_buff()并使用其中的fgets函数clear_buff()来读取流上的剩余字符.代码按照我的预期工作.

#include <stdio.h>

#define MAXLEN 80

void clear_buff(void);

int main (void) {
  int age;
  char name[20];

  puts("Enter your age:");
  scanf("%d",&age);

  clear_buff();

  puts("Enter your name:");
  scanf("%s",name);

  printf("Your age is %d\n",age);
  printf("Your name is %s\n",name);

  return 0;
}

void clear_buff(void){
   char junk[20];
   fgets(junk,MAXLEN,stdin);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么fflush(stdin)不参与这个计划?

书中说该fflush函数清除了流上的任何缓冲数据.我知道fflush()如果使用I/O流,该 函数是C标准函数.

Sha*_*our 7

fflush用于处理输出或更新流并将其与输入流一起使用是未定义的行为,来自fflush的 cppreference C部分:

如果给定流是输入类型或者给定流是更新类型,但最后一个I/O操作不是输出操作,则行为是未定义的.

未定义的行为是标准未指定的行为,这意味着程序的结果是不可预测的,这可能意味着行为似乎正常或崩溃或其他不良影响.

cppreference与草案C99标准部分中的语言一致7.19.5.2 fflush函数说:

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

虽然这不是你真正的问题,但似乎你已经找到了一个解决方法,问题C,刷新stdin涵盖了一些适当的冲洗方式stdin.