它在C.当一个学生的日记程序通过我尝试学生的输入名称获取编译器跳过命名它的工作原理与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()
调用工作,但是控制台输入通常是行缓冲的,并且如果某个前面的输入处理没有使用缓冲数据并且缓冲区包含a,那么该缓冲行将被接受为输入而无需等待进一步输入。
对于例如,如果您有:
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()
版本是否或如何工作。
_compiler_不会跳过任何内容。 Te编译器负责_generating_代码不为_executing_它 - 如果有什么“跳过”任何东西,那么它是_your code_这样做, – Clifford
通常在'stdin'流中使用'fgets()',而不是那些可怕的不安全的''get ()'。对于'scanf()'带空格的字符串问题,请参阅https://stackoverflow.com/questions/1247989/how-do-you-allow-spaces-to-be-entered-using-scanf – Clifford
代码是什么_calling_'注册()'看起来像?在调用之前输入缓冲区的状态是什么? – Clifford