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 :

Conversion avec la fonction "atoi()"


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 25
    Points : 17
    Points
    17
    Par défaut Conversion avec la fonction "atoi()"
    Salut à tous,
    je suis pour le moment en train de travailler sur mon examen de repêchage en c et j'ai un soucis.

    Je dois faire une conversion d'une chaîne de caractères en un entier pour vérifier l'intégrité de mes données (je dois vérifier si il s'agit bien d'une heure valide).

    Problème, lorsque j'utilise la fonction "atoi()", la première conversion se passe bien mais la seconde pas... ma deuxième variable temporaire prend en fait la valeur de la première et celle de la deuxième. J'ai comme l'impression qu'il y a un buffer sur la fonction "atoi()" mais je ne sais pas quoi faire pour le vider si c'est bien le cas.

    Voici ma fonction:

    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
    int blindage_heures(char *chiffre)
    {
        int i = 0;
        int ok = 0;
        char tmph[2] = {0};
        char tmpm[2] = {0};
        int valeurh = 0;
        int valeurm = 0;
     
        // doit être sous le format HH:MM
        while(i<5)
        {
            if(i == 0 || i == 1)
            {
                if(chiffre[i] < 48 || chiffre[i] > 57)
                {
                    ok = 101;
                }
            }
            if(i == 2)
            {
                if(chiffre[i] != ':')
                {
                    ok = 101;
                }
            }
            if(i == 3 || i == 4)
            {
                if(chiffre[i] < 48 || chiffre[i] > 57)
                {
                    ok =101;
                }
            }
            i++;
        }
     
        tmph[0] = chiffre[0];
        tmph[1] = chiffre[1];
        valeurh = atoi(tmph);
     
        if(valeurh > 12) // Ne peut pas dépasser 12 heures
        {
            ok = 101;
        }
     
        tmpm[0] = chiffre[3];
        tmpm[1] = chiffre[4];
        valeurm = atoi(tmpm);
     
        if(valeurm > 59) // Ne peut pas dépasser 60 minutes
        {
            ok = 101;
        }
     
        if(valeurh == 12 && valeurm != 0) // Ne peut pas travailler plus de 12h
        {
            ok = 101;
        }
     
        return ok;
    }
    Je suis sur que ça doit être une bêtise mais vu l'heure tardive, la bêtise devient un gros problème...

    Merci d'avance pour votre aide !!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    atoi() lit une chaîne de caractères, qui doit donc être dûment clôturée avec un '\0' final, sinon le programme ne saura jamais où s'arrêter.

    Définis char tmph[2] et char tmpm[2] avec une taille de 3 éléments plutôt que deux, et place le caractère ci-dessus une fois pour toutes dans l'élément [2] de chaque tableau. Regarde aussi du côté de strtol().

    Enfin, si cette fonction ne t'est pas imposée, tu peux t'en passer complètement. Les symboles des chiffres sont consécutifs dans la table ASCII, si bien que tu peux vérifier si un caractère se trouve bien dans le bon intervalle pour affirmer que c'est bien un chiffre. Vérifie que chacun de tes quatre caractères est compris entre >= '0' (à ne pas confondre avec '\0') et <= '9', retranche ensuite la valeur de '0' pour les ramener à zéro, tu multiplies par 10 le chiffre des dizaines et tu additionnes les deux.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 25
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse.

    Je viens d'essayer ta première solution en déclarant mes variables temporaires de 3 et non de 2 et en plaçant le caractère de fin de chaîne '\0'.

    Tout fonctionne parfaitement maintenant, merci !

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

Discussions similaires

  1. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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