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 :

tester le type d'une chaine


Sujet :

C

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    valeur_num est un float.
    Et le 'truk_correct', c'est quoi ? Tu ne peux pas donner tous les élémenrs d'un coup ? C'est fatiguant à la longue...
    Pas de Wi-Fi à la maison : CPL

  2. #22
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    je resimplifie le problème .

    j'ai un flottant que je convertis en chaine de cacactère
    puis je veux la remettre en flottant
    (imposé par mes structures)


    la 1° etape je n'ai pas de problème mais la 2° coince.

    imaginon une chaine de caractère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *chaine_num;
    float nombre;
    chaine_num = "200.00";
    et je voudrais la passer en
    nombre = 200.00

    Je ne pense pas que ce soit possible caractère par caractère?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int est_nombre(char *m) {
    int i = 0;
    int n = 1;
    while (m[i] != '\0') {
    if &#40;&#40;m&#91;i&#93; < '0' || m&#91;i&#93; > '9'&#41; && &#40;m&#91;i&#93; != '.'&#41;&#41; n = 0;
    i++;
    &#125;
    return n;
    &#125;

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    imaginon une chaine de caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *chaine_num;
    float nombre;
    chaine_num = "200.00";
    et je voudrais la passer en
    nombre = 200.00
    Qu'est-ce qui ne va pas avec sscanf() ou strtod() ?
    Pas de Wi-Fi à la maison : CPL

  4. #24
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    j'aimerais tester avant de le faire sinon il va me mettre un segmentation fault?

    car je suis pas sur .

    en fait j'ai une structure qui a un membre numérique flottant un autre membre une chaine et un autre un type.


    //structure table des symboles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct symbole
    &#123;
       char *nom_var;
       char *val_ch;
       float val_num;
       int type;
       symbole  lien;
    &#125;Symbole;
    et pour insérer une nouvelle valeur je me trouve avec une chaine ,
    si ca correspont a un "flottant" alors je la met dans la case val_num , sinon je la met dans val_ch.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    j'aimerais tester avant de le faire sinon il va me mettre un segmentation fault?
    Ecrit un petit code de test. Il n'y a pas 36 façons de procéder..
    en fait j'ai une structure qui a un membre numérique flottant un autre membre une chaine et un autre un type.
    Commence déjà par apprendre à utiliser les fonctions citées de manière simple. Ensuite, l'integration dans ton application sera un jeu d'enfant. Il faut aborder les difficultés une par une.
    Pas de Wi-Fi à la maison : CPL

  6. #26
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    je suis d'accord mais ma dernière fonction doit etre presque correcte


    si j'ai un caractere qui est un .

    c'est à dire .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *m;
    m = "1000.000";

    si je fais afficher m[i] pour i allant de 1 à la fin du mot

    il m'affichera
    1
    0
    0
    0
    .
    0
    0


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int est_nombre&#40;char *m&#41; &#123;
    int i = 0;
    int n = 1;
    while &#40;m&#91;i&#93; != '\0'&#41; &#123;
    if &#40;&#40;m&#91;i&#93; < '0' || m&#91;i&#93; > '9'&#41; && &#40;m&#91;i&#93; != '.'&#41;&#41; n = 0;
    i++;
    &#125;
    return n;
    &#125;
    En appelant est_nombre il doit me retourner 1 mais il me retourne 0 le probleme vient du .

    m[i] != '.' est le bon test??? merci

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *m;
    m = "1000.000";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int est_nombre&#40;char *m&#41; &#123;
    int i = 0;
    int n = 1;
    while &#40;m&#91;i&#93; != '\0'&#41; &#123;
    if &#40;&#40;m&#91;i&#93; < '0' || m&#91;i&#93; > '9'&#41; && &#40;m&#91;i&#93; != '.'&#41;&#41; n = 0;
    i++;
    &#125;
    return n;
    &#125;
    En appelant est_nombre il doit me retourner 1 mais il me retourne 0 le probleme vient du .
    Plus simple. Tu apprends à utiliser correctement strtol() ou strtod(), notamment le 2 ème paramètre.

    Sinon, il faut être précis. Tu veux tester si un nombre est entier ? Il suffit que les caractères soient dans l'ensemble "-0123456789". Pas besoin de faire un cas particulier pour '.'...

    voir strchr().

    On peut être plus précis sur la position du '-', mais ça fait déjà le ménage.
    Pas de Wi-Fi à la maison : CPL

  8. #28
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    j'ai pas forcement besoin d'utiliser la conversion chaine -> nombre .

    Je vais relire la fonction

  9. #29
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    /*
    Il est également possible d'utiliser la fonction strtol() :

    char buf[32]="15";
    long n;
    char* end;

    n=strtol(buf, &end, 10);

    suite à l'exécution de la fonction, end contient l'adresse où la conversion s'est arrêtée. Le troisième paramètre de strtol() correspond à la base utilisée (décimale dans l'exemple)
    */



    Donc je fais un

    end == strlen(buf) --> et doit renvoyer 1?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    j'ai pas forcement besoin d'utiliser la conversion chaine -> nombre .
    Ca m'étonnerait ! Mais de toutes façons, tu n'es pas obligé d'utiliser le résultat...
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    end == strlen(buf) --> et doit renvoyer 1?
    Tu compares une adresse et une longueur ? Jamais tu réflechis avant d'écrire ?

    Non il suffit de tester ce qu'ily a en *end. Si c'est pas 0, c'est que le format n'est pas correct.
    Pas de Wi-Fi à la maison : CPL

  12. #32
    Débutant
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 268
    Points : 139
    Points
    139
    Par défaut
    humhum ca n'a pas l'air de marcher



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    float nombre;
    char *o = "1000.0";
    char *end;
     
     
    nombre=strtol&#40;o, &end, 10&#41;;
    printf&#40;"%d",*end&#41;;  --> m''affiche 46 &#40;qui correspond au code Ascii du point

  13. #33
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par molesqualeux
    humhum ca n'a pas l'air de marcher



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    float nombre;
    char *o = "1000.0";
    char *end;
     
     
    nombre=strtol&#40;o, &end, 10&#41;;
    printf&#40;"%d",*end&#41;;  --> m''affiche 46 &#40;qui correspond au code Ascii du point
    strtol() permet de convertir une chaine de caractere en long (type entier), ce n'est donc pas cette fonction qu'il faut utiliser mais l'equivalent pour les types reels : strtod().

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par molesqualeux
    humhum ca n'a pas l'air de marcher



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float nombre;
    char *o = "1000.0";
    char *end;
     
     
    nombre=strtol&#40;o, &end, 10&#41;;
    strtol() et strtoul() c'est pour les entiers. Pour les flottants c'est strtod(). On l'a pas déjà dit 14.000 fois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf&#40;"%d",*end&#41;;  --> m''affiche 46 &#40;qui correspond au code Ascii du point
    Ben oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf&#40;"%c\n",*end&#41;;
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Tester la longueur d'une chaine de caractères
    Par greg64 dans le forum IHM
    Réponses: 9
    Dernier message: 12/06/2006, 15h54
  2. Tester le type d'une variable
    Par mzt.insat dans le forum Linux
    Réponses: 5
    Dernier message: 30/05/2006, 18h37
  3. concaténer un type char à une chaine
    Par Fabs dans le forum C
    Réponses: 8
    Dernier message: 11/11/2005, 15h21
  4. tester le type d'une valeur saisie
    Par lalaurie40 dans le forum C
    Réponses: 1
    Dernier message: 09/10/2005, 21h52
  5. [PL/SQL 9i] Tester le type d'une donnée
    Par tomca dans le forum Oracle
    Réponses: 10
    Dernier message: 29/09/2005, 09h17

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