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 :

Convertir des char en int


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Convertir des char en int
    Bonjour à tous
    j'ai créé une structure ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct {
      char com;
      char nEquip;
      char manip;
      char param;
      char nCapt;
      char sens;
      int16_t val;
    }manCapt;
    La structure est chargée par un tableau de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          manCapt.com=com[1];
          manCapt.nEquip=com[2];
          manCapt.manip=com[3];
          manCapt.param=com[4];
          manCapt.nCapt=com[5];
          manCapt.sens=com[6];
          manCapt.val=ci(com[7])*1000 + ci(com[8])*100 + ci(com[9])*10 + ci(com[10]);
    ci est une fonction de conversion char->décimal.
    Mon problème: cela fonctionne si j'ai bien un chiffre de 4 caractères mais si j'ai un chiffre à 1, 2 ou 3 caractères cela ne va plus.
    Y a-t'il un moyen élégant de régler cela?

  2. #2
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Ça manque quelques informations ? si tu as 1, 2 ou 3 caractères, ils sont disposé comment dans ton tableau com ?
    Ce tableau de caractère (com) a t'il un caractère nul en dernière position ? exemple, si il y a trois caractère a partir de com[7], qui y a t'il en com[10] ?
    Bref, postes un exemple de ce tableau (com) ça sera plus simple.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Merci pour tes questions.
    Le tableau com est formé à partir d'une saisie clavier. Exemple pour les 6 premiers caractères: B 2 D 1 5 + puis de 1 à 4 caractères qui sont les chiffres d'un nombre de 1 à 9999.
    Le tableau se termine après la saisie par un caractères NUL, c'est à dire que com[] peut comporter de 8 à 11 caractères (avec le '\0').

    Pour la petite histoire, mais je pense que ça n'a pas d'intérêts ici, le code cité en exemple signifie:
    B:Commande relais de la base; 2: relais n°2; D:delai de fermeture; 1: 10 secondes; 5: capteur N°5; +: en progression positive; xxxx: valeur de déclenchement.
    C'est à dire qu'avec cette commande je vais déclencher une relais à partir de la lecture de la valeur d'un capteur.

    Je sais que la solution serait peut-être d'entrer par exemple 0005 ou 0025 ou 0560, il faudrait que je controle le nombre de caractères entrés?

  4. #4
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Comme tu utilises un tableau C, et vu que ton nombre est suivi d'un caractère nul, tu pourrais utiliser la fonction atoi à partir du premier caractère du nombre. ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char tab[] = {'?', '?', '?', '1', '2', '3', '\0'};
        int16_t val = atoi(&tab[3]);
    ou stoi, comme tu es en C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char tab[] = {'?', '?', '?', '1', '2', '3', '\0'};
        int16_t val = std::stoi(&tab[3]);
    PS : Les indices des tableaux vont de 0 à N-1 or je vois que tu commence par l'indice 1 ? Est-ce volontaire ?
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 747
    Par défaut
    Citation Envoyé par mormic Voir le message
    Le tableau com est formé à partir d'une saisie clavier. Exemple pour les 6 premiers caractères: B 2 D 1 5 + puis de 1 à 4 caractères qui sont les chiffres d'un nombre de 1 à 9999.
    Le tableau se termine après la saisie par un caractères NUL, c'est à dire que com[] peut comporter de 8 à 11 caractères (avec le '\0').
    En mode bourrin (faire 1 boucle)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        manCapt.val = (com[7] - '0');
     
        if (com[8] != '\0') {
            manCapt.val = ((manCapt.val * 10) + (com[8] - '0'));
     
            if (com[9] != '\0') {
                manCapt.val = ((manCapt.val * 10) + (com[9] - '0'));
     
                if (com[10] != '\0') {
                    manCapt.val = ((manCapt.val * 10) + (com[10] - '0'));
                }
            }
        }

  6. #6
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    En mode bourrin
    Oui j'avais envisagé cette méthode, mais comme ta définition l'indique, ce n'est pas élégant.
    Merci tout de même.

    je vois que tu commences par l'indice 1 ? Est-ce volontaire ?
    Oui car le premier caractère est utilisé dans un 'case' pour indiquer la manip à faire. (700B2D15+1942 : le 7 est le code de la manip, 00 est l'adresse de stockage en mémoire SPIFFS pour un ESP32)

    Je viens d'utiliser std::stoi(com[9] et cela fonctionne comme voulu; j'obtiens 1942 et si je mets 36, j'obtiens bien 36.
    Merci bien pour cette aide.

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 747
    Par défaut
    Citation Envoyé par mormic Voir le message
    Je viens d'utiliser std::stoi(com[9] et cela fonctionne comme voulu; j'obtiens 1942 et si je mets 36, j'obtiens bien 36.
    Merci bien pour cette aide.
    atoi a été dépréciée au profit de strtol



    C'est 1 documentation C++ : par exemple 1 bibliothèque XXX.h en C devient cXXX en C++. Par exemple, stdlib.h/cstdlib stdio.h/cstdio

  8. #8
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Citation Envoyé par foetus Voir le message
    atoi a été dépréciée au profit de strtol
    Dépréciée par qui ?
    Elle est toujours décrite dans la norme, même la C23. (pas de mention de dépréciation).
    sur : https://en.cppreference.com/w/c/string/byte/atoi ils ne disent rien non plus.

    PS : C'est std::stoi qu'il a utilisé.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 747
    Par défaut
    Citation Envoyé par CGi Voir le message
    Dépréciée par qui ?
    Je te réponds juste pour te répondre

    std::atoi, std::atol, std::atoll, documentation cppreference.com en anglais
    Actual C++ library implementations fall back to C library implementations of atoi, atoil, and atoll, which either implement it directly (as in MUSL libc) or delegate to strtol/strtoll (as in GNU libc).
    Donc effectivement les fonctions C ne sont pas dépréciées et elles sont encore présentes "tel quel", mais 1 bonne partie des Linux, dans la librairie standard (std::atoX), utilise par défaut strtol/strtoll.
    Après, on est ici dans les forums C++ pas C

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

Discussions similaires

  1. convertir un char en int
    Par boby666 dans le forum C
    Réponses: 4
    Dernier message: 30/12/2007, 11h08
  2. Convertir un char en int
    Par Panaméen dans le forum C
    Réponses: 8
    Dernier message: 30/12/2007, 10h14
  3. [(cast)] convertir un char en int...
    Par APoLLoN1234 dans le forum C++
    Réponses: 12
    Dernier message: 15/03/2006, 23h15
  4. convertir un char en int / et prob d'espace
    Par yanchasp dans le forum C++
    Réponses: 20
    Dernier message: 07/02/2006, 19h17
  5. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23

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