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] = ' ';
len--;
}
if(len < 8)
printf("nPassword less than 8 characters.nPlease Retry.n");
else
bad = 0;
}
while ((eat = getchar()) != 'n' && eat != EOF);
编辑:
我犯了一个愚蠢的错误,这个错误不是由循环本身引起的,而是因为调用函数(该代码是其中的一部分(的代码引起的。该位置的额外getchar()
导致了此错误。它是通过去除额外的CCD_ 8来解决的。感谢所有帮助我解决问题的人,我向大家道歉。
使用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'
并保存为带有附加' '
的字符串。OP需要更长的输入缓冲区。
关键问题是,如果邪恶用户输入长密码,该怎么办?把它都吃光然后再试一次?IMO,试图输入非常长的密码的用户应该被视为恶意的,而不仅仅是"恶意";oops";。使输入缓冲区为读取预期输入行所需的(8+1+1(的2x到4x。如果输入已满,请退出。如果输入密码长度!=8,允许用户重试。
如果读取的第一个字符是空字符,则BTWif(pswd[len-1] == 'n'){
为UB。