问题描述
while ((eat = getchar()) != '\n' && eat != EOF); // where 'eat' is long long eat
这是我正在使用的行。
问题,您问?啊哈!我必须按[ENTER]
两次,以将输入实际“发送”到程序中。 (我希望这是在scanf
和fgets
之后都起作用的函数中)
这似乎让人想起单独使用getchar()
,但是我是一个新手,我会通过删除getchar()
来解决这些问题,这当然无法在这里。
我很困惑该怎么办,并且是否有可能实施一种简单解决方案,而该解决方案不会强制让用户按下[ENTER]
两次。
更大,更好的代码段:
int num,q=0; static int pins[8]; char pswd[9]; char bad =1,Y_N;
while(bad == 1) {
printf("\nEnter (8 char) Password : ");
getchar();
fgets(pswd,sizeof(pswd),stdin);
int len = strlen(pswd);
if(pswd[len-1] == '\n'){
pswd[len-1] = '\0';
len--;
}
if(len < 8)
printf("\nPassword less than 8 characters.\nPlease Retry.\n");
else
bad = 0;
}
while ((eat = getchar()) != '\n' && eat != EOF);
编辑:
我犯了一个愚蠢的错误,此错误不是由循环本身引起的,而是由于调用了函数(该代码所在的部分)的代码。该位置额外的getchar()
导致了此错误。解决方法是删除多余的getchar()
。感谢所有帮助我解决此问题的人,向大家致歉。
解决方法
可以使用fgets(,stdin);
和简单的while(){...}
构造来简化代码
int main(int argc,char *argv[])
{
int bad = 1;
char pswd[20]={0};//2x strlen of proper password + \n + NULL
while(bad == 1)
{
//prompt user
printf("Enter password (8 characters) : " );
//read user input value
fgets(pswd,sizeof(pswd),stdin);
//remove newline from user input
pswd[strcspn(pswd,"\n")] = 0;
//(replaces the need for the while loop at bottom of original post.)
if(strlen(pswd) == 8)//test input for length
{
bad = 0;//exit loop if pswd good
}
}
return 0;
}
您可以添加一些重试代码以处理错误的密码
, char pswd[9];
太小,无法读取8个字符的密码'\n'
并另存为 string
并附加了'\0'
。 OP需要更长的输入缓冲区。
关键问题是,如果邪恶用户输入 long 密码该怎么办?刚吃完再试一次? IMO,试图输入非常长的密码的用户应该被视为具有敌意,而不仅仅是“哎呀”。使输入缓冲区的2倍到读取预期的输入行所需的(8 + 1 + 1)的4倍。如果输入已满,请退出。如果输入的密码长度为!= 8,则允许用户重试。
如果读取的第一个字符是空字符,则
BTW if(pswd[len-1] == '\n'){
是UB。