c-flush()函数不适用于stdin



我对这个愚蠢的问题感到抱歉。我有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 %dn",age);
   printf("Your name is %sn",name);
   return 0;
}

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

然后我更改了代码,添加了名为clear_buff()的函数,并使用clear_buff()中的fgets函数读取流中的剩余字符。代码如我所期望的那样工作。

#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 %dn",age);
  printf("Your name is %sn",name);
  return 0;
}
void clear_buff(void){
   char junk[20];
   fgets(junk,MAXLEN,stdin);
}

我的问题是fflush(stdin)为什么不在这个程序中工作?

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

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

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

未定义行为是指标准没有指定的行为,这意味着程序的结果是不可预测的,这可能意味着看似正常的行为、崩溃或其他不希望的影响。

cppreference与C99标准草案7.19.5.2中的语言一致。fflush函数表示:

如果流指向其中没有输入最近的操作,fflush函数会导致要传递到主机环境的流的未写入数据要写入文件;否则,行为是未定义的。

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

相关内容

最新更新