controle d'adresse email
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

controle d'adresse email



  1. #1
    spiderhack

    controle d'adresse email


    ------

    slt a tous moi je sui un jeune etudiant en genie logiciel enfaite j'ai un probleme que je n'arrive pas a resoudre.

    voici mon bleme:

    Ecrire une fonction en c qui prend un email en argument puis retourne 1 si l'email est valide sinon 0.

    *La partie (1) doit commencer par une lettre et doit contenir et/ou les caracteres suivants: le point(.) le tiret du 6(-) le tiret du 8(_)

    *La partie (2) ne doit contenir que des lettres

    *La partie(3) ne doit contenir que des lettres et doit avoir 2 ou 3 lettres seulement

    ok c'est ca merci a vous !!!
    Voila ce que moi j'ai fai mai ca ne fonctionne pa. apres la saisi de l'email le programme se plante je crois que mon ble c'est la declraration de la chaine.
    s'il vous plait j'ai recours a votre aide.

    Code:
    #include<stdio.h>
    int EMAIL(char ch[]);
    
    int EMAIL(char ch[]){
        int i,j,arb,pnt,valide,cpt=0;
        ch="";
        printf("Veuillez saisir votre adresse email:\n");
        scanf("%s",&ch);
    
        if(ch[0]>=65&&ch[0]<=90||ch[0]>=97&&ch[0]<=122){ //controle de l'alphabetisation du premier caractere
                    valide=1;
            }else
                    valide=0;
            if(valide==1){ //controle de la premiere partie
        for(i=0;i<ch[i]!='\0';i++)
        {
                if(ch[i]='@'){
                arb=ch[i];
            }
            for(j=0;j<arb;j++)
            {
                //controler a travers leur code ASCII les valeurs comprises entre A-Z et a-z y compris le - le _ et le .
                if(ch[j]>=65&&ch[j]<=90||ch[j]>=97&&ch[j]<=122||ch[j]==45||ch[j]==95||ch[j]==46){
                        valide=1;
            }else
                        valide=0;
         }
        }
    }
            if(valide==1){ //controle de la deuxieme partie
                for(i=arb;i<ch[i]!='\0';i++){
                if(ch[i]='.'){
                    pnt=ch[i];
                }
                for(j=arb;j<pnt;j++){
                    if(ch[j]>=65&&ch[j]<=90||ch[j]>=97&&ch[j]<=122){
                        valide=1;
                    }else
                        valide=0;
            }
            }
        }
            if(valide==1){  //controle de la troisieme partie
                for(i=pnt;i<ch[i]!='\0';i++){
                        cpt=cpt+1;
                    if(ch[i]>=65&&ch[i]<=90||ch[i]>=97&&ch[i]<=122){
                            if(cpt<=3){
                                valide=1;
                            }else
                                valide=0;
                }
            }
        }
            if(valide==1){
                return 1;
            }else
                return 0;
    }
    
    main(){
        char ch[30]="";
        EMAIL(ch);
    
    }

    -----

  2. #2
    Flyingbike
    Modérateur*

    Re : controle d'adresse email

    Bonjour et bienvenue

    Pour un génie logiciel vous auriez pu trouver la bonne section pour poser votre question....

    Déplacement en conséquence
    La vie trouve toujours un chemin

  3. #3
    pm42

    Re : controle d'adresse email

    En gros :
    Code:
    int EMAIL(char ch[]);
    Inutile.

    Code:
    int EMAIL(char ch[]){
    La méthode devrait s'appeler email en minuscules (les majuscules c'est pour les macros) et recevoir plutôt un char* mais passons.

    Code:
        ch="";
        printf("Veuillez saisir votre adresse email:\n");
        scanf("%s",&ch);
    Cela devrait être fait dans le main, pas dans la fonction. Mais là aussi, passons.

    Code:
        if(ch[0]>=65&&ch[0]<=90||ch[0]>=97&&ch[0]<=122){ //controle de l'alphabetisation du premier caractere
    Si tu veux vérifier des code ascii, tu devrais utiliser des lettres directement comme ch[0]>='A'.
    Mais le plus simple est d'utiliser les méthodes faites pour comme isalpha dans ctype.h

    Code:
        for(i=0;i<ch[i]!='\0';i++)
    Ici le i<ch[i]!='\0' ne veut rien dire et c'est sans doute le problème principal.

    D'une façon générale, tu dois avoir un débugger dans ton environnement qui te permet de suivre ton programme en pas à pas et d'examiner les valeurs des variables. C'est sans doute ce que tu devrais faire.

  4. #4
    Chanur

    Re : controle d'adresse email

    Bonjour,

    Je n'ai pas compris la ligne :
    Code:
    scanf("%s",&ch);
    Pourquoi passes-tu l'adresse du pointeur où tu veux écrire, au lieu du pointeur lui-même ?
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : controle d'adresse email

    Citation Envoyé par Chanur Voir le message
    Bonjour,

    Je n'ai pas compris la ligne :
    Code:
    scanf("%s",&ch);
    Pourquoi passes-tu l'adresse du pointeur où tu veux écrire, au lieu du pointeur lui-même ?
    En effet, j'ai raté celle là.

  7. #6
    spiderhack

    Re : controle d'adresse email

    merci a vous tous pour l'intervention.
    Enfaite pm42 j'ai utiliser for(i=0;i<ch[i]!='\0';i++) pour parcourir la chaine du debut jusqu'au dernier caractere. ou peut etre qu'il y'a une autre methode. Et merci pour le signal de mes erreurs je les ai rectifier.

  8. #7
    pm42

    Re : controle d'adresse email

    Citation Envoyé par spiderhack Voir le message
    j'ai utiliser for(i=0;i<ch[i]!='\0';i++) pour parcourir la chaine du debut jusqu'au dernier caractere. ou peut etre qu'il y'a une autre methode.
    J'ai compris que tu voulais faire ça mais c'est juste une façon incorrecte.
    for(i=0; ch[i]!=0; i++) devrait mieux marcher.

  9. #8
    spiderhack

    Re : controle d'adresse email

    Oup ! desole bro mais ca marche pas

  10. #9
    Chanur

    Re : controle d'adresse email

    Citation Envoyé par spiderhack Voir le message
    Oup ! desole bro mais ca marche pas
    Là, il faut nous en dire un peu plus, si tu veux de l'aide ...
    Et ce serait sûrement utile que tu postes ton programme corrigé (sans oublier la balise CODE).
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  11. #10
    Dlzlogic

    Re : controle d'adresse email

    Bonjour,
    Je ne pense pas que mon compilateur accepterait l'instruction
    ch="";
    Je donnerai un conseil, éclaircir le code, c'est à dire rajouter des espaces, aller à la ligne, mettre les commentaires, soit en position 1 de la ligne, soit au bout de la ligne, après le point-virgule, soit en tête de la fonction.
    Bien respecter l'indentation. En tout cas j'ai pas été très loin dans la lecture de ce code.

  12. #11
    spiderhack

    Re : controle d'adresse email

    merci a vous tous vous: et voici le code apres quelques rectification
    Code:
    #include<stdio.h>
    int email(char ch[];);
    
    int email(char ch[];){
        char ch[30]="";
        int i,j,arb,pnt,valide,cpt=0;
        if(ch[0]>='A'&&ch[0]<='Z'||ch[0]>='a'&&ch[0]<='z'){ //controle de l'alphabetisation du premier caractere
                    valide=1;
            }else
                    valide=0;
            if(valide==1){ //controle de la premiere partie
        for(i=0;i<ch[i]!=0;i++)
        {
                if(ch[i]='@'){
                arb=ch[i];
            }
            for(j=0;j<arb;j++)
            {
                valide=0;
                //controler a travers leur code ASCII les valeurs comprises entre A-Z et a-z y compris le - le _ et le .
                if(ch[j]>='A'&&ch[j]<='Z'||ch[j]>='a'&&ch[j]<='z'||ch[j]=='-'||ch[j]=='_'||ch[j]=='.'){
                        valide=1;
            }else
                        valide=0;
         }
        }
    }
            if(valide==1){ //controle de la deuxieme partie
                for(i=arb;i<ch[i]!=0;i++){
                if(ch[i]='.'){
                    pnt=ch[i];
                }
                for(j=arb;j<pnt;j++){
                    valide=0;
                    if(ch[j]>='A'&&ch[j]<='Z'||ch[j]>='a'&&ch[j]<='z'){
                        valide=1;
                    }else
                        valide=0;
            }
            }
        }
            if(valide==1){  //controle de la troisieme partie
                for(i=pnt;i<ch[i]!=0;i++){
                        valide=0;
                        cpt=cpt+1;
                    if(ch[i]>='A'&&ch[i]<='Z'||ch[i]>='a'&&ch[i]<='z'){
                            if(cpt<=3){
                                valide=1;
                            }else
                                valide=0;
                }
            }
        }
            if(valide==1){
                return 1;
            }else
                return 0;
    }
    
    int main(){
        char ch[30]="";
        printf("Veuillez saisir votre adresse email:\n");
        scanf("%s",&ch);
        email(ch);
    
    }

  13. #12
    Chanur

    Re : controle d'adresse email

    +1 pour les conseils de Dzlogic
    Citation Envoyé par Dlzlogic Voir le message
    Je ne pense pas que mon compilateur accepterait l'instruction
    ch="";
    J'ai essayé :
    Code:
    gcc -Wall email.c -o email
    résultat : une palanqué de warnings, mais rien pour ch="" (en même temps ch est un pointeur : on peut lui donner l'adresse qu'on veut).
    Code:
    email.c: In function ‘EMAIL’:
    email.c:8:5: attention : format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat]
    email.c:10:5: attention : suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
    email.c:15:5: attention : suggest parentheses around comparison in operand of ‘!=’ [-Wparentheses]
    email.c:17:13: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité [-Wparentheses]
    email.c:23:13: attention : suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
    email.c:31:13: attention : suggest parentheses around comparison in operand of ‘!=’ [-Wparentheses]
    email.c:32:13: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité [-Wparentheses]
    email.c:36:17: attention : suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
    email.c:44:13: attention : suggest parentheses around comparison in operand of ‘!=’ [-Wparentheses]
    email.c:46:17: attention : suggest parentheses around ‘&&’ within ‘||’ [-Wparentheses]
    email.c: Hors de toute fonction :
    email.c:60:1: attention : return type defaults to ‘int’ [-Wreturn-type]
    email.c: In function ‘main’:
    email.c:64:1: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type]
    Le Warning de la ligne 17 est en fait une erreur : if(ch[i]='@') est très faux ... (ça devrait être ==). Idem à la ligne 32.

    C'est, à mon sens, une bonne pratique de considérer tous les warnings comme des erreurs potentielles et de les corriger.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  14. #13
    sandrecarpe

    Re : controle d'adresse email

    Salut,

    https://www.tutorialspoint.com/c_sta...ry/ctype_h.htm

    Tu as ici toutes les fonctions que tu as besoin. T'auras par la même occasion un code plus compréhensible

  15. #14
    Dlzlogic

    Re : controle d'adresse email

    Salut Chanur,
    J'ai essayé plusieurs combinaisons int, char etc. Quoi qu'il y ait à gauche, mon compilateur n'accepte pas l'instruction :
    ... = "";
    Mon compilateur Borland C++ Builder (je sais, je compile avec l'option que l'utilise habituellement, cad C/C++).
    Ouille, ça date de 2002, je suis complètement périmé.

  16. #15
    Chanur

    Re : controle d'adresse email

    Personnellement, j'utilise gcc sous Linux, mais j'avais des doutes sur la syntaxe "char ch []"
    Je n'utilise jamais cette notation inutile.
    Soit c'est un tableau alloué : char tableau [TAILLE], donc un pointeur constant, soit c'est un pointeur variable : char * pointeur
    Je ne vois pas du tout l'utilité d'une notation intermédiaire (surtout si les différents compilateurs la traitent différemment. )

    Mais la syntaxe char * pointeur = ""; est autorisée (avec un warning disant que c'est obsolète)
    Dernière modification par Chanur ; 25/03/2017 à 21h10.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  17. #16
    Dlzlogic

    Re : controle d'adresse email

    Oui, là en fait, on discute de notions fondamentales, on sait ce à quoi ça correspond, mais je ne suis pas sûr que notre ami spiderhack arrive à suivre.
    Je pense que son code aurait dû être précédé d'un algorithme clair. J'ai un peu de mal à comprendre que l'on apprenne à coder à des élèves qui ne comprennent pas le fonctionnement de l'informatique.
    A titre d'exemple, la déclaration (incorrecte) de la chaine deux fois, ainsi que la valeur de la variable "valide".
    Je suis sûr que si l'algorithme avait été écrit en français, testé à la main etc. il n'aurait pas perdu son temps à écrire du code "au hasard".
    Mais un forum n'est pas fait pour replacer un professeur.
    Bref on pourrait envisager de lui écrire une bonne version. Ce serait valable si on était sûr d'avoir un retour, ce qui est vraiment très rare.
    Par ailleurs, et pour le fun, ce type de vérification se fait souvent avec les expressions régulières.
    Bonne soirée.

  18. #17
    spiderhack

    Re : controle d'adresse email

    merci encore a vous tous et j'ai finalement bien ameliorer mon code mais jusqye là ca reste.
    Code:
    #include<stdio.h>
    #include<string.h>
    int email(char ch[]);
    
    int email(char ch[]){
    int i, j, arb, pnt, valide=1, cpt=0;
        if(ch[0]<'A' || ch[0]>'Z' || ch[0]<'a' || ch[0]>'z') //controle de l'alphabetisation du premier caractere
               return 0;
        for(i=0;i<strlen(ch);i++) //controle de la premiere partie
        {
                if(ch[i]=='@'){
                arb=ch[i];
    
            for(j=0;j<arb;j++)
            {
                //controler les valeurs comprises entre A-Z et a-z y compris le - le _ et le .
                if(ch[j]<'A' || ch[j]>'Z' || ch[j]<'a' || ch[j]>'z' || ch[j]!='-' || ch[j]!='_' || ch[j]!='.'){
                        valide=0;
         }
                }
        }
    }
            if(valide==1){ //controle de la deuxieme partie
                for(i=arb;i<strlen(ch);i++){
                if(ch[i]=='.'){
                    pnt=ch[i];
                for(j=arb;j<pnt;j++){
                    if(ch[j]<'A' || ch[j]>'Z' || ch[j]<'a' && ch[j]>'z'){
                        valide=0;
            }
                }
            }
        }
            }
            if(valide==1){  //controle de la troisieme partie
                for(i=pnt;i<strlen(ch);i++){
                        cpt=cpt+1;
                    if(ch[i]<'A' || ch[i]>'Z' || ch[i]<'a' || ch[i]>'z'){
                        valide=0;
                            if(cpt>3){
                                valide=0;
                }
            }
        }
    }
            return valide;
    }
    
    int main(){
        char ch[30];
        printf("Veuillez saisir votre adresse email:\n");
        scanf("%s",&ch);
        if(email(ch)) return 1;
        else return 0;
    
    }

  19. #18
    Chanur

    Re : controle d'adresse email

    1. C'est toujours aussi absurde de passer à scanf un char** (l'adresse de ch) au lieu de l'adresse où tu veux écrire (ch)
    Quand je dis absurde, c'est que ça NE PEUT PAS marcher : tu essaies d'écrire à l'adresse de la constante ch, pas à l'adresse qu'elle pointe.
    2. Ce serait bien d'afficher le résultat. Là on ne sait pas si l'adresse email saisie est acceptée ou pas.
    3. Tes envolées d'accolades sont jolies (on dirait des oiseaux migrateurs ) mais totalement illisibles : indente correctement ton code.
    4. Au début de la fonction email :
    Code:
    if(ch[0]<'A' || ch[0]>'Z' || ch[0]<'a' || ch[0]>'z')
          return 0;
    N'importe quel caractère est forcément soit supérieur à 'Z' (qui vaut 90) soit inférieur à 'a' (qui vaut 97)
    Donc la fonction email retournera toujours 0

    Je ne suis pas allé plus loin.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  20. #19
    spiderhack

    Re : controle d'adresse email

    non bro desolé mai ca reste dans ta comprehension:
    if(ch[0]<'A' || ch[0]>'Z' || ch[0]<'a' || ch[0]>'z')
    return 0;
    cette instruction permet de tester le premier caractere s'il n'est pas compris entre 'A' et 'Z' ou entre 'a' et 'z' il retourne 0;
    mai dans le cas contraire il continue de tester les autres instructions qui suivent.

  21. #20
    Chanur

    Re : controle d'adresse email

    Citation Envoyé par spiderhack Voir le message
    non bro desolé mai ca reste dans ta comprehension:
    if(ch[0]<'A' || ch[0]>'Z' || ch[0]<'a' || ch[0]>'z')
    return 0;
    cette instruction permet de tester le premier caractere s'il n'est pas compris entre 'A' et 'Z' ou entre 'a' et 'z' il retourne 0;
    mai dans le cas contraire il continue de tester les autres instructions qui suivent.
    non : si je prend 'd' (code ASCII 100), ton test vérifie :
    est-ce que 'd' est inférieur à 'A' (65) ? non
    est-ce que 'd' est supérieur à 'Z' (90) ? oui => return 0

    Une suite de conditions associés par des "ou" est vraie dès qu'une condition est vraie.

    Je suppose que tu voulais écrire : if ((ch[0]<'A' || ch[0]>'Z') && (ch[0]<'a' || ch[0]>'z'))
    Dernière modification par Chanur ; 28/03/2017 à 19h36.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

Discussions similaires

  1. 1 email 1 adresse 2 destinataires????
    Par nanou17 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 04/07/2008, 21h38
  2. adresse email
    Par invite8e29257b dans le forum Internet - Réseau - Sécurité générale
    Réponses: 2
    Dernier message: 06/04/2008, 15h01
  3. Adresse email jetable
    Par invite37693cfc dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 12/07/2003, 12h25