在下面的代码中刷新stdin缓冲区时,不要知道我哪里出错了

时间:2017-11-12 05:57:26

标签: c while-loop buffer stdin

I have attached output image of my program. you can see the problem i am facing by clicking here

下面的代码是我的程序,用来读取用户输入的字符,并使用我自己的内置函数isalpha()和isalnum的my_isalpha()和my_isalnum()函数检查它是字母还是数字)。 不适用于while循环的第二次迭代

#include <stdio.h>
#define NUM     1
#define ALPHA   2
#define ASCII   3
#define BLANK   4


int main()
{
  char option;

  do
  {
      //declaration of function
      char character;
      int user_option, status;

      //get the character from the user
      printf("Enter the Character:");

      //clears both buffers to read the character
      fflush(stdin);
      fflush(stdout);


       //reads one character at a time
      character = getchar();

      //prompt the user for the option to check
      printf("Choice Below Option\n");
      printf("1.isalnum\n2.isalpha\n");
      printf("Enter your Option:");
      scanf("%d", &user_option);

      //validation of the user_option
      switch(user_option)
      {
          case 1:
                  status = my_isalnum(character);
                  if(status == NUM)
                  {
                      printf("Character '%c' is an number", character);
                  }
                  else
                  {
                      printf("Character '%c' is not a number", character);
                  }
                  break;

          case 2:
                  status = my_isalpha(character);
                  if(status == ALPHA)
                  {
                      printf("Character '%c' is an Alphabet", character);
                  }
                  else
                  {
                     printf("Character '%c' is not Alphabet",character);
                  }
                  break;
            default:
                 puts("Invalid Choice.....");
     }

    printf("\nDo you want to continue?[Y/N]:");
     scanf(" %c", &option);
 }while (option == 'Y' || option == 'y');
 fflush(stdin);
 fflush(stdout);
 return 0;
}
 //Function chaecks for the Number
 int my_isalnum(char character)
 {
   return (character >= '0' && character <= '9')?  NUM : -1;
  }

  //functionn checks for the alphabets
  int my_isalpha(char character)
  {
      return (character >= 'a' && character <= 'z' || character >= 'A' && character <= 'Z') ? ALPHA: -1;

   }

上面的代码第一次正常工作,但在while循环的第二次迭代期间。当我给&#34; Y&#34;作为输入代码,直接跳转到scanf .rather的user_option部分,然后等待&#34; getchar()&#34; - 函数。

即使在使用fflush()函数填充缓冲区后,我也无法提示程序输入字符。

2 个答案:

答案 0 :(得分:1)

刷新stdin是未定义的行为。刷新用于输出流而非输入流。

根据标准§7.21.5.2

  

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

同样int getchar(void)get char()会返回int

Quickfix:从代码中删除fflush(stdin)

printf("\nDo you want to continue?[Y/N]:");
     scanf(" %c", &option);
     getchar(); // this dummy getchar() will consume the `\n` from stdin.
 }while (option == 'Y')

注意:

同样,其他解决方案建议使用fpurge()是一个选项,但同样它是非标准且不可移植

答案 1 :(得分:0)

stdout()将适用于stdin缓冲区。如果您想暂时清除__fpurge()缓冲区使用//fflush(stdin); __fpurge(stdin); ,那么它不是正确的解决方案。

     getchar();
 }while (option == 'Y' || option == 'y');

有关详细信息,请打开fpurge()的手册页。手册页说

函数 fpurge() 清除给定流的缓冲区。对于输出流,这会丢弃任何未写入的输出。对于输入流,这将丢弃从底层对象读取但尚未通过getc(3)获得的任何输入;这些功能是非标准不可移植。函数fpurge()在4.4BSD中引入,在Linux下不可用。

因此,如果您想使其通用,请再使用一个getchar()来清除stdin缓冲区

FirebaseDatabase db = FirebaseDatabase.getInstance();
                            DatabaseReference myRef = db.getReference("users");
                            myRef.child(mAuth.getUid()).setValue(email);

我希望它会有所帮助。