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 :

Identifiants valides


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Identifiants valides
    Bonjour à tous,

    Alors voila j'ai un problème avec ce code:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    typedef struct
    {
        char *essai;
    }nb;
     
    int main(void)
    {
        int N, i;
        nb *test;
     
        printf("Donnez le nombre de variable a tester: ");
        scanf("%d", &N);
        test = malloc(N*sizeof(nb));
        if (test == NULL)
        {
            printf("Erreur: allocation échoué");
        }
        for (i=0;i<N;i++)
        {
            printf("Entrez vos propositions: ");
            gets(test[i].essai);
        }
        for (i=0;i<N;i++)
        {
            if (test[i].essai[i] == '-' || isdigit(test[i].essai[1]) || test[i].essai[i] < 0)
            {
                printf("NO");
            }
            else
            {
                printf("YES");
            }
        }
        free(test);
        return 0;
    }
    Pourquoi quand je l'exécute il m'affiche deux fois d'un coup "Entrez vos propositions". Merci d'avance (ce code sert à savoir si le nom taper est valide ou non pour une variable ou une fonction)

  2. #2
    Membre éclairé Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Par défaut
    dans ta deuxieme boucle l'une des conditions n'est -elle pas incomplète ?

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut correction balises
    Gao,

    Moi je vois surtout ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for (i=0;i<N;i++)
        {
            printf("Entrez vos propositions: ");
            gets(test[i].essai);
        }
    alors que les pointeurs test[i].essai ne sont pas initialisés, pas de mémoire réservée...

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    gets() est officiellement obsolète et déprécié par la norme, elle ne doit plus être utilisé (et n'aurait jamais dû l'être d'ailleurs).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Citation Envoyé par droggo Voir le message
    alors que les pointeurs test[i].essai ne sont pas initialisés, pas de mémoire réservée...
    J'ai pourtant alloué la mémoire qu'il fallait avec le malloc non ? je comprend pas ce que tu veux dire

    Pour gets je l'ai remplacer par scanf.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par scary Voir le message
    J'ai pourtant alloué la mémoire qu'il fallait avec le malloc non ?
    Pour test oui mais pas pour essai!

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hie,
    Citation Envoyé par scary Voir le message
    J'ai pourtant alloué la mémoire qu'il fallait avec le malloc non ? je comprend pas ce que tu veux dire
    Pour le tableau de structures, mais pas chaque pointeur dans chaque structure !!

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    A d'accord et comment je peux faire cela ? je fais un malloc pour chaque possibilité ? vous auriez pas un petit exemple que lequel je pourrais m'appuyer svp?

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Feo,
    Citation Envoyé par scary Voir le message
    A d'accord et comment je peux faire cela ? je fais un malloc pour chaque possibilité ? vous auriez pas un petit exemple que lequel je pourrais m'appuyer svp?
    Standard :

    Pour chaque structure de ton tableau :

    - commencer par mettre les pointeurs à NULL, pour éviter l'utilisation d'un pointeur invalide

    - puis, AVANT d'utiliser un pointeur, réserver de la place mémoire (SAUF si appel d'une fonction qui réserve elle-même la place !!)

    - quand les données ne sont plus nécessaires, LIBÉRER la mémoire.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Bon j'ai préférer faire comme ça car je ne voyais vraiment pas comment faire ce que tu m'as dis.
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    typedef struct
    {
        char essai[100];
    }nb;
     
    int main(void)
    {
        int N, i, j;
        nb *test;
     
        printf("Donnez le nombre de variable a tester: ");
        scanf("%d", &N);
        test = malloc(N*sizeof(nb));
        if (test == NULL)
        {
            printf("Erreur: allocation échoué");
        }
        for (i=0;i<N;i++)
        {
            printf("Entrez vos propositions: ");
            scanf("%s", test[i].essai);
        }
        for (i=0;i<N;i++)
        {
            for (j=0;j<N;j++)
            {
                if (test[i].essai[j] == '-' || isdigit(test[i].essai[1]) || test[i].essai[j] < 0)
                {
                    printf("NO\n");
                }
                else
                {
                    printf("YES\n");
                }
            }
        }
        free(test);
        return 0;
    }
    La ça marche mais j'aimerais bien que vous me montriez avec l'allocation svp. Puis la vérification ne marche pas

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici quelques corrections:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    typedef struct
    {
        char essai[100];
    } nb;
     
    /* -tc- Elimine les caracteres non lus par scanf() */
    void purge(void)
    {
        int c;
     
        while ((c = fgetc(stdin)) != '\n' && c != EOF)
        {
        }
    }
     
    int main(void)
    {
        int N;
        int i, j;
        nb *test;
        int rv;
        int ret = 0;
     
        do
        {
            printf("Donnez le nombre de variable a tester: ");
            /* -tc- Pour etre portable, il est conseille de forcer l'affichage
               ici en purgeant explicitement le flux de sortie standard */
            fflush(stdout);
            rv = scanf("%d", &N);
            purge();
        }
        while (rv != 1);
     
        test = malloc(N * sizeof(nb));
        if (test != NULL)
        {
            /* -tc- ATTENTION: les lignes qui suivent ne doivent pas etre executees
               lorsque l'allocation n'a pas reussi */
            for (i = 0; i < N; i++)
            {
                printf("Entrez vos propositions: ");
                fflush(stdout);
                /* -tc- Tu n'utilises pas correctement scanf(). Pour la saisie de
                   chaines, je prefere fgets(). Au minimum, limite le nombre de
                   caracteres pouvant etre saisis par scanf(). */
                scanf("%99s", test[i].essai);
                purge();
            }
     
            for (i = 0; i < N; i++)
            {
                int ok = 1;
     
                for (j = 0; ok == 1 && test[i].essai[j] != 0; j++)
                {
                    /* -tc- Attention a tes conditions. Ceci devrait fonctionner si
                       la locale est celle par defaut (i.e. "C") */
                    if ((j == 0 && isdigit((unsigned char) test[i].essai[j])) ||
                            (isalnum((unsigned char) test[i].essai[j]) == 0 &&
                             test[i].essai[j] != '_'))
                    {
                        ok = 0;
                    }
                }
     
                printf("%s\n", (ok == 1) ? "Oui" : "Non");
            }
     
            free(test), test = NULL;
        }
        else
        {
            fprintf(stderr, "Erreur: allocation impossible\n");
            ret = EXIT_FAILURE;
        }
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Merci Thierry ça marche super comme je voulais

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Attention au vocabulaire...
    Citation Envoyé par droggo Voir le message
    - commencer par mettre les pointeurs à NULL, pour éviter l'utilisation d'un pointeur invalide
    Mettre les pointeurs à NULL (pointeur invalide) permet d'éviter l'utilisation de pointeurs indéterminés.
    - puis, AVANT d'utiliser un pointeur, réserver de la place mémoire (SAUF si appel d'une fonction qui réserve elle-même la place !!)
    Un pointeur, comme n'importe quelle variable, doit avoir été initialisé avant usage. Une bonne façon d'initialiser un pointeur est de lui donner comme valeur, l'adresse d'un bloc alloué par malloc().

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Valider un numéro CAS (identifiant d'une substance chimique)
    Par Cyclemmanuel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/03/2012, 18h00
  2. L'identifiant d'un contrôle pour un Validator
    Par zooffy dans le forum Développement Web avec .NET
    Réponses: 2
    Dernier message: 03/12/2010, 00h09
  3. Identifier les cellules qui contienent une Validation
    Par A@Lah dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/10/2007, 13h09
  4. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46

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