换行问题使用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] = '\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。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...