c-在使用getchar[已解决]清除Stdin后,接收输入的换行问题


while ((eat = getchar()) != 'n' && eat != EOF); // where 'eat' is long long eat

这是我正在使用的线路。

你问这个问题吗?啊哈!我必须按两次[ENTER],才能真正将输入"发送"到我的程序。(我希望这是在scanffgets之后工作的函数中(

这似乎让人想起了单独使用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。

相关内容

  • 没有找到相关文章

最新更新