IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Contrôle d'un numéro de téléphone


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Contrôle d'un numéro de téléphone
    Bonjour !

    J'ai un ennui avec une fonction qui ne marche pas ! Elle permet de créer un numéro de téléphone tout en s'assurant que le numéro est valide. Les numéros valides ont comme caractéristiques :

    — Les caractères ne doivent être que des chiffres ;
    — Ils doivent avoir 9 chiffres ;
    — Il y a deux catégories de numéros : mobile et fixes ! les mobiles commencent soit par 77,76,70,78. Et les fixes par 33 ou 30. Voici mon code qui ne marche pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void ajout_tel(FILE*pt_fichier,Contact* p)
    {
    int ok = 1 ;
    do{
    printf("entrer le numero de telephone: ");
    scanf("%s",p->tel);
    fprintf(pt_fichier,"%s",p->tel);
    system("cls");
    if(strlen(p->tel)> 9) ok = 0 ; 
    if(p->tel[i]!='0' && p->tel[i]!='1' && p->tel[i]!='2' && p->tel[i]!='3' && p->tel[i]!='4' && p->tel[i]!='5' && p->tel[i]!='6' && p->tel[i]!='7' && p->tel[i]!='8' && p->tel[i]!='9')
     ok=0;
     if(p->tel[0]!= 7 && p->tel[0]!= 3) //ici on s'assure que le premier caractere du numero indique soit le type mobile ou fixe//
       ok = 0 ;
    if(p->tel[0]== 7 && (p->tel[1]!= 7  && p->tel[1]!= 6 && p->tel[1]!= 8 && p->tel[1]!= 0 ) ) ok = 0 ; //un num ki debute par 7 ne peut aller qu'qvec un '7','6','8','0'.
    if(p->tel[0]== 3 && (p->tel[1]!= 0 && p->tel[1]!= 3) ) ok = 0 ;
    }while(!ok);
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 482
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Salut,

    Et qu'est ce qui ne marche pas et que souhaites-tu savoir pour le faire marcher ?

  3. #3
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Pourquoi à certains endroits tu vérifies des caractères alors qu'à d'autres tu vérifies des entiers?

    Sinon la variable i sort de où?



    EDIT: Et qu'est-ce que vient faire FILE*pt_fichier dans les arguments de la fonctions?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour,

    Je trouve ton code pas très lisible et pas très bien indenté, fait aussi attention aux "nombres magiques".
    Image que tu aies 200 débuts de numéro de téléphones valides, ton code serait totalement illisible.

    Voici le pseudo-code que je te proposerais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    int isValide( char * numero )
    {
              static char ** debutTelValide  = {"77", "76"}; // ici tu liste les débuts de numéros de téléphones valides.
     
             // si numero n'a pas exactement 9 caractères (+ '\0' final)
                      return 0; // false
     
             for( int i = 0; i != 9 ; i++) // on parcours les 9 caractères
                     // si le caractère n'est pas un nombre (cf la fonction is_digit)
                              return 0; // false
     
     
             // On parcours chaque chaînes de caractères de debutTelValide
                     // On le compare au début du numéro de téléphone ( cf strncmp )
                     // Si la comparaison est correcte
                              return 1; // true
     
            return 0; // false
    )
    }
    Je pense qu'il sera un peu plus lisible et un peu plus simple à comprendre et te permettra de voir plus facilement où il y a une erreur si tu en a une.

    EDIT : quelques pages de man utiles
    http://man.developpez.com/man3/isalpha.3.php
    http://man.developpez.com/man3/strcmp.3.php

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    moins1 je devai tester des caracteres pour tout! le FILE*pt_fichier c parce que les numeros seront ecri dan un fichier! et le i je voulai tester tous les caracteres du numero

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    neckara le truc c'est que je dois repeter a l'utilisateur de saisir un numero de telephone tant que les numeros qu'il donne ne sont pas valides

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Citation Envoyé par Sassy Voir le message
    neckara le truc c'est que je dois repeter a l'utilisateur de saisir un numero de telephone tant que les numeros qu'il donne ne sont pas valides
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void saisirNumero(void)
    {
           char buffer[15] = "";
           while( ! isValid(buffer) )
           {
                    printf("Veuillez saisir un numero de tel.\n");
                    fgets( ... );
                    // là tu peux faire quelques traitements comme enlever les blanc, ainsi on pourrait entrer :
                    // 01234567890 ou 01 23 45 78 90
           }
    }
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void saisirNumero(void)
    {
           char buffer[15] = "";
           do
           {
                    printf("Veuillez saisir un numero de tel.\n");
                    fgets( ... );
                    // là tu peux faire quelques traitements comme enlever les blanc, ainsi on pourrait entrer :
                    // 01234567890 ou 01 23 45 78 90
           } while( ! isValid(buffer) );
    }
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void saisirNumero(void)
    {
           char buffer[15] = "";
     
           printf("Veuillez saisir un numero de tel.\n");
           fgets( ... );
     
           while( ! isValid(buffer) )
           {
                    printf("On t'a demande de saisir un numero de telephone banane !\n");
                    fgets( ... );
           }
    }
    Dans le dernier exemple, pour éviter la duplication de code, on peut créer une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void getTelFrom( char * buffer, size_t length, FILE * stream)
    {
                     fgets( ... );
                    // là tu peux faire quelques traitements comme enlever les blanc, ainsi on pourrait entrer :
                    // 01234567890 ou 01 23 45 78 90
    }
    N.B. J'ai mis 15 juste à titre d'exemple.

    Man de fgets : http://man.developpez.com/man3/fgets.3.php

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 482
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Voici le pseudo-code que je te proposerais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int isValide( char * numero )
    {
              static char ** debutTelValide  = {"77", "76"}; // ici tu liste les débuts de numéros de téléphones valides.
    }
    Je doute que cette écriture soit correcte, à la vue de la tripotée de warnings qu'elle génère. Ne serait-ce pas plutôt ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const char* debutTelValide[2]  = {"77", "76"};

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je doute que cette écriture soit correcte, à la vue de la tripotée de warnings qu'elle génère. Ne serait-ce pas plutôt ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const char* debutTelValide[2]  = {"77", "76"};
    Je reconnais ne pas avoir compilé

    En fait, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const char* debutTelValide[]  = {"77", "76"};
    Pour permettre des débuts de tailles différentes (mais bon, après tous ces warnings, je ne suis pas très bien placé pour chipoter ).

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 482
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Chipotons et enlevons le 2 pour laisser l'initializer donner la taille au tableau ^^

    2 qui d'ailleurs donne le nombre d'éléments du tableau et non la longueur d'une chaine (= d'un élément du tableu), puisque 2 caractères dans le code source sont en fait 3 caractères en mémoire. Il faut un '\0' pour terminer la chaîne. En effet, j'ai bien mis un tableau de chaînes de caractères et non un tableau de tableaux de caractères comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const char debutTelValide[3][2]  = {"77", "76"}; // 3 caractères * 2 éléments
    Mais je t'aime bien quand même

Discussions similaires

  1. Récupérer le numéro de téléphone entrant
    Par louisss dans le forum Access
    Réponses: 23
    Dernier message: 26/07/2023, 18h21
  2. Contrôle de saisie numéro téléphone
    Par franco9 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 17/09/2012, 16h20
  3. récuperation d'un numéro de téléphone
    Par herzleid dans le forum Delphi
    Réponses: 4
    Dernier message: 17/07/2007, 09h25
  4. Identification de numéros de téléphone
    Par sfxElrick dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 17/03/2005, 18h40
  5. Insérer un numéro de téléphone
    Par Fleep dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 31/10/2004, 09h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo