2017-10-21 50 views
0
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 

    } 
    } 
} 
+1

Le _compiler_ ne saute rien. Le compilateur est responsable de _generating_code pas de _executing_ it - si quelque chose "saute" quelque chose, alors c'est votre _your code_, – Clifford

+0

En règle générale, utilisez 'fgets()' sur le flux 'stdin' plutôt que l'horrible 'safe'() '. Pour le problème de 'string-with-spaces' scanf() ', voir https://stackoverflow.com/questions/1247989/how-do-you-allow-spaces-to-be-entered-using-scanf – Clifford

+0

Qu'est-ce que le code _calling_ 'signup()' ressemble? Quel est l'état du tampon d'entrée avant de l'appeler? – Clifford

Répondre

1

On ne sait pas peut-être de l'information donnée pourquoi gets() échoue alors que le commenté scanf() L'appel fonctionne, cependant l'entrée de console est généralement mise en mémoire tampon, et si un traitement d'entrée précédent n'a pas consommé les données tamponnées et que le tampon contient a, cette ligne buffered sera acceptée comme entrée sans attendre d'autres entrées.

Pour par exemple si vous aviez:

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

L'utilisateur peut entrer s<newline> mais le scanf() ne consomme que l's laissant (\n) dans le tampon, de sorte que dans signup(), le premier appel d'entrée est immédiatement satisfait comme une ligne vide. Un modèle pour traiter ceci est de s'assurer que toutes les entrées extraient la ligne entière. Dans le cas ci-dessus par exemple:

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

Pensez encapsulant:

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

Le problème se produit avec une entrée qui ne traite pas la ligne, et pas seulement getchar(), mais aussi scanf() et gets() qui est il n'est pas clair si ou comment votre version scanf() fonctionne.