C fgets跳过用户输入,即使在刷新缓冲区时也是如此

时间:2017-03-04 16:12:22

标签: c string input buffer fgets

我正在尝试从用户那里获得输入,而fgets正在跳过第一个输入。我知道原因是fgets正在阅读' \ n'从前面的陈述或至少我认为这是原因,但我似乎无法解决它

请注意,这是较大项目的一部分

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #define MAX 1000

 int main(void) {

  char  content[MAX];
  char  content2[MAX];
  char  content3[MAX];
  char  content4[MAX];
  char  content5[MAX];
  char  input[4];
  char  input2[4];

  printf("Do you want to continue yes/no?\n");
  fgets(input, 4, stdin);

  if (strncmp (input, "no", 2) == 0) {
     break;
  }
  else if (strncmp (input, "yes", 3) == 0) {
  fflush(stdin);

     printf("Country:\n");
     fgets(content, MAX, stdin);

     printf("Province/state: \n");
     fgets(content2 ,MAX, stdin);

     printf("Postal/zip code:\n");
     fgets(content3 ,MAX, stdin);

     printf("Company:\n");
     fgets(content4 ,MAX, stdin);

     printf("Email:\n");
     fgets(content5 ,MAX, stdin);
  }

3 个答案:

答案 0 :(得分:3)

"yes"加上终止空字符占用4个字节,因此'\n'保留在缓冲区中。将更多缓冲区分配给input并将其新长度传递给fgets(),以便在不在流中留下换行符的情况下读取yes

另请注意fflush(stdin);调用未定义的行为,因此您不应该使用它。

答案 1 :(得分:0)

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #define MAX 1000

 int main(void) {

  char  content[MAX];
  char  content2[MAX];
  char  content3[MAX];
  char  content4[MAX];
  char  content5[MAX];
  char  input[4];
  char  input2[4];

  printf("Do you want to continue yes/no?\n");
  fgets(input, 4, stdin);

  if (strncmp (input, "no", 2) == 0) {
     exit(0);
  }
  else if (strncmp (input, "yes", 3) == 0) {
  fflush(stdin);//this is not portable
  while(getchar()!='\n');//this thing works
     printf("Country:\n");
     fgets(content, MAX, stdin);

     printf("Province/state: \n");
     fgets(content2 ,MAX, stdin);

     printf("Postal/zip code:\n");
     fgets(content3 ,MAX, stdin);

     printf("Company:\n");
     fgets(content4 ,MAX, stdin);

     printf("Email:\n");
     fgets(content5 ,MAX, stdin);
  }
 }

fflush()大部分时间都不起作用。请改用以下代码

while(getchar()!='\n');

答案 2 :(得分:-2)

您是否尝试在fflush中添加 stdin ?你应该有这样的东西:

fflush(标准输入);