1

我很抱歉这个愚蠢的问题。我有 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函数清除流上的任何缓冲数据。而且我知道 fflush()如果使用 I/O 流,该函数是 C 标准函数。

4

1 回答 1

7

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

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

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

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

如果 stream 指向未输入最近操作的输出流或更新流,则 fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。

尽管这不是您的问题,而且您似乎已经找到了解决方法,但问题C, flushing stdin涵盖了一些正确的 flushing 方法stdin

于 2014-10-19T01:26:40.860 回答