它是 c.when 中的学生日记程序

Its a student diary program in c.when i try to input name of student by gets compiler skips name it works with scanf but it cant input spaces

void signup(struct user *u)

 { char c_pswd[80];
   int i,flag=1;

   clrscr();

   printf("\n>ENTER FULL NAME: ");
   gets(u->name);//scanf("%s",u->name);

   printf("\n>ENTER USERNAME: ");
   scanf(" %s",u->username);

   printf("\n>ENTER DATE OF BIRTH: ");
   scanf(" %s",u->dob);

   printf("\n>ENTER EMAIL: ");
   scanf(" %s",u->email);

   printf("\n>ENTER GENDER(M/F): ");
   scanf(" %c",&(u->gender));

   printf("\n>ENTER MOBILE NUMBER: ");
   scanf("%d",&u->mobile_no);

   while(flag==1) {

   printf("\n>ENTER PASSWORD(ATLEAST 8 CHAR): ");
   scanf("%s",u->password);

   printf("\n>CONFIRM PASSWORD: ");
   scanf("%s",c_pswd);

   if(strcmp(u->password,c_pswd)!=0)

    {
       clrscr();

       printf("\t\tPASSWORDS DON'T MATCH ENTER AGAIN...");

      }

   else {

     clrscr();
     printf("\n\n\n\n\n\n\n\t\t\tSIGNUP SUCCESFUL!!!");

     printf("\n\n\nREDIRECTING TO LOGIN...");

     delay(5000);//time delay of 5 seconds
     flag=0;//AGAIN GOES FOR PASSWORD INPUT AND VERIFICATION

    }
  }
}

从给出的信息中可能不清楚为什么 gets() 在注释掉的 scanf() 调用有效时失败,但是控制台输入通常是行缓冲的,如果说一些前面的输入处理没有消耗缓冲数据并且缓冲区包含一个 ,缓冲行将被接受为输入而无需等待进一步输入。

例如,如果您有:

menu_select = getchar() ;
if( menu_select == 's' )
{
    signup( &user ) ;
}

用户可以输入 s<newline>scanf() 仅消耗 s 并在缓冲区中留下 (\n),因此在 signup() 中,第一个输入调用立即作为空行得到满足。

处理此问题的一种模式是确保所有输入都提取整行。例如在上面的例子中:

menu_select = getchar() ;
while( menu_select != `\n` || getchar() != `\n ) ; // empty flush loop
if( menu_select == 's' )
{
    signup( &user ) ;
}

考虑封装它:

char inchar()
{
    char ch ;
    scanf( "%c", &ch) ;
    while( ch != `\n` || getchar() != `\n ) ; // empty flush loop
    return ch ;
}

任何不处理整行的输入都会出现问题,不仅是 getchar(),还有 scanf()gets() scanf() 版本有效。