它是 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()
版本有效。
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()
版本有效。