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

时间:2014-10-19 01:23:11

标签: 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;
}

当我向第一个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);
}

我的问题是为什么fflush(stdin)没有参与此计划?

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

1 个答案:

答案 0 :(得分:7)

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

  

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

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

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

  

如果流指向输出流或其中的更新流   最近的操作没有输入,fflush功能导致任何   要传递到主机环境的该流的未写入数据   写入文件;否则,行为未定义。

虽然这不是你真正的问题,似乎你已经找到了解决办法,问题C, flushing stdin涵盖了一些正确的刷新方式stdin