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()函数填充缓冲区后,我也无法提示程序输入字符。
答案 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);
我希望它会有所帮助。