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 :

String to char


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Octobre 2021
    Messages : 31
    Par défaut String to char
    Bonjour,

    J’ai une fonction qui retourne un string et je souhaite mettre le contenu de ce string dans un char…Le contenu du char doit pouvoir être modifié par la suite. Étant donné que le string ne contient que 4 caractères, j’ai pensé traiter le string comme un array et utiliser pushback…Mais cela ne me plait pas, il doit y avoir plus propre.

    De votre avis quelle est la meilleure façon de procéder ?

    Merci et bonne journée

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    Tu dis avoir une string de 4 char et veux la mettre dans 1 char. C'est impossible.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    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 746
    Par défaut
    Citation Envoyé par debuteenc Voir le message
    j’ai pensé traiter le string comme un array et utiliser pushback…
    std::string est bien 1 tableau de caractères ... et d'ailleurs je ne vois pas comment modéliser autrement sauf cas très particuliers.
    pushback permet d'ajouter 1 caractère ... aucun rapport avec 1 conversion.


    Citation Envoyé par debuteenc Voir le message
    mettre le contenu de ce string dans un char…
    tu veux dire char* ... mais cela passe par 1 allocation dynamique alors que std::string gère cela de façon transparente.
    Tu travailles avec du code en C ?

    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
    #include <iostream>
    #include <cstring>
     
     
    int main()
    {
        std::string str = "toto";
        char* c_str;
     
        c_str = new (std::nothrow) char[str.length() + 1];
     
        if (c_str != NULL) {
            strcpy(c_str, str.c_str());
    //      c_str[ str.length() ] = '\0';
     
            std::cout << "main - c_str: " << c_str;
     
            delete[] c_str;
        } else {
            std::cout << "main - allocation failed";
        }
     
     
        return EXIT_SUCCESS;
    }
    Édit: suite à la remarque de @baragouine

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Octobre 2021
    Messages : 31
    Par défaut
    Merci! Je travaille en C++, le C c'est pour les microcontrôleurs...je vais tester cette solution et je vous tiens au courant...
    Bonne soirée

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        c_str = new char[5];
     
        if (c_str != NULL) {
    Un new n'est pas censé lever une exception lors d'un échec, pourquoi tu teste le résultat?

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    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 746
    Par défaut
    Citation Envoyé par baragouine Voir le message
    Un new n'est pas censé lever une exception lors d'un échec, pourquoi tu teste le résultat?
    Habitude du C ... sur la documentation de l'operator new[] tu as raison (<- lien cplusplus.com en anglais)

    Je corrige. Mais si @debuteenc l'utilise avec du C, je pense qu'il faut mieux utiliser les fonctions du C malloc/ strdup/ ...
    Pour du C++, il faut mieux utiliser std::copy ou std::string::copy.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Citation Envoyé par foetus Voir le message
    Habitude du C ... sur la documentation de l'operator new[] tu as raison (<- lien cplusplus.com en anglais)

    Je corrige. Mais si @debuteenc l'utilise avec du C, je pense qu'il faut mieux utiliser les fonctions du C malloc/ strdump/ ...
    Pour du C++, il faut mieux utiliser std::copy ou std::string::copy.
    T'as le C dans le sang.

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Octobre 2021
    Messages : 31
    Par défaut
    ...J'ai joint la synthèse de mon problème en fichier joint. Je récapitule mon défi. J'ai une fonction qui retourne un string (exemple 1 qui contient 4 caractères) et avec le contenu de ce string je dois afficher ces 4 caractères (C1, C2, C3, C4) à l'aide d'une fonction " afficher_coup " qui, elle même, appelle une fonction " afficher_couleurs "...

    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
    void afficher_couleurs(char c1, char c2, char c3, char c4)
    {
      cout << ' ' << c1 << ' ' << c2 << ' ' << c3 << ' ' << c4;
    }
     
    void afficher_coup(char c1, char c2, char c3, char c4)
    {
      afficher_couleurs(c1, c2, c3, c4);    
     
      cout << " : ";
     
    }
     
    void play()
    {
        string exemple1 = fonction1(); 
     
        afficher_coup (c1, c2, c3, c4);
    }

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,
    Citation Envoyé par baragouine Voir le message
    Un new n'est pas censé lever une exception lors d'un échec, pourquoi tu teste le résultat?
    Normalement, oui, sauf que tu as aussi l'opérateur new en version nowthrow...

    Et cette version ne lance pas une exception (vu qu'elle n'est pas sensée le faire ), mais elle renvoie bel et bien un pointeur nul
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 746
    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 746
    Par défaut
    Citation Envoyé par debuteenc Voir le message
    Je récapitule mon défi
    Je ne veux pas être méchant mais wahou quel défi et 1 défi en C tu t'es trompé de section.

    En mode "crade", en C++ on a cela :
    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
    83
    84
    85
    86
    #include <iostream>
    #include <cstring>
     
     
    class t_couleurs {
    public:
     
        void alloc_and_get_str(char** c_str) const {
            if ((*c_str) == NULL) {
                char temp_c_str[] = {c1, c2, c3, c4, '\0'};
     
                (*c_str) = strdup(temp_c_str);
            }
        }
     
        void init(char input_c1, char input_c2, char input_c3, char input_c4) {
            c1 = input_c1;
            c2 = input_c2;
            c3 = input_c3;
            c4 = input_c4;
        }
     
        friend std::ostream& operator<<(std::ostream&, const t_couleurs&);
     
    private :
     
        char c1, c2, c3, c4;
    };
     
     
    class t_coup {
    public:
     
        t_coup(std::string str_couleurs) {
            if (str_couleurs.length() == 4) {
                couleurs.init(str_couleurs[0], str_couleurs[1], str_couleurs[2], str_couleurs[3]);
            } else {
                couleurs.init('.', '.', '.', '.');
            }
        }
     
    public:
     
        void alloc_and_get_str(char** c_str) const { couleurs.alloc_and_get_str(c_str); }
     
        void free_str(char** c_str) const { if ((*c_str) != NULL) { free((*c_str)); (*c_str) = NULL; } }
     
        friend std::ostream& operator<<(std::ostream&, const t_coup& c);
     
    private :
     
        t_couleurs couleurs;
    };
     
     
    std::ostream& operator<<(std::ostream& os, const t_couleurs& c) {
        os << ' ' << c.c1 << ' ' << c.c2 << ' ' << c.c3 << ' ' << c.c4;
     
        return os;
    }
     
     
    std::ostream& operator<<(std::ostream& os, const t_coup& c) {
        os << c.couleurs << " : ";
     
        return os;
    }
     
     
    int main()
    {
        t_coup coup1 = std::string("rrbg");
        t_coup coup2 = std::string("rg");
        char*  c_str = NULL;
     
        coup1.alloc_and_get_str(&c_str);
     
        std::cout << "coup1: " << coup1 << std::endl << "coup2: " << coup2;
     
        if (c_str != NULL) { std::cout << std::endl << "other: " << c_str; }
     
        coup1.free_str(&c_str);
     
     
        return EXIT_SUCCESS;
    }

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    Plus il y a de messages, moins le tout a du sens.
    Soit tu es en C++, et alors tu écris du C++.
    Soi tu es en C, et tu écris du C.
    Passer de l'un à l'autre... mouais, c'est pas interdit, pas impossible, mais vu que tu débutes clairement, je vois pas pour quelle raison tu serais dans un cas qui oblige ça.
    Et si par hasard tu as besoin d'un const char*, c'est pour ça que std::string::c_str() existe.

    Quant au défi... j'aurais du mal à utiliser ce terme pour 3 lignes qui utilisent std::cout, m'enfin...
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Par défaut
    Salut,

    Citation Envoyé par debuteenc Voir le message
    avec le contenu de ce string je dois afficher ces 4 caractères (C1, C2, C3, C4) à l'aide d'une fonction " afficher_coup " qui, elle même, appelle une fonction " afficher_couleurs "...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void afficher_couleurs(char c1, char c2, char c3, char c4)
    {
      cout << ' ' << c1 << ' ' << c2 << ' ' << c3 << ' ' << c4;
    }

    Tu dois avoir une double personnalité, c'est pas possible. Travaille en string, c'est aisance assurée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void afficher_couleurs(const std::string & c) 
    {
        std::cout<< ' '<< c[0]<< ' '<< c[1]<< ' '<< c[2]<< ' '<< c[3];
    }

  13. #13
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Octobre 2021
    Messages : 31
    Par défaut
    Tout d'abord, merci à ceux qui respectent mon côté débutant. Malheureusement je ne connais qu'une toute petite partie du C++, partant bien des termes utilisés dans vos solutions me sont inconnus...Cher kaytlin, je pense que le fait que je ne puis pas modifier la procédure " afficher " t'a échappé. Si cette procédure n'était pas gelée, j'aurais bien évidemment utilisé des strings...Le défi c'est réaliser quelque chose qui est difficile relativement aux moyens potentiellement pouvant être mis en œuvre...Cher foetus, merci pour ton code. A sa lecture, je constate que je connais pas les termes c++ class, public, ostream, friend, private et j'en passe...Je constate amèrement que le cours que je suis (d'une grande école...) c'est de la daube! Je vais arrêter de le suivre!
    Que puis-je faire, à votre avis, pour progresser...valablement?

    Pour info j'ai joint le code, lourd certes, mais qui m'a permis de finir et de rendre mon exercice.

    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
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
     
    void mise_en_forme (char &c1, char &c2, char &c3, char &c4, char &r1, char &r2, char &r3, char &r4, string s1, string s2)
        {
            c1 = s1[0];
            c2 = s1[1];
            c3 = s1[2];
            c4 = s1[3];
            r1 = s2[0];
            r2 = s2[1];
            r3 = s2[2];
            r4 = s2[3];
        }
     
    int main(void)
    {
        char c1, c2, c3, c4, r1, r2, r3, r4;
        string s1 = "abcd"; //exemple de chaine
        string s2 = "efgh";
     
        mise_en_forme (c1,c2,c3,c4,r1,r2,r3,r4,s1,s2); // Passage des strings en char
     
        cout<<c1<<c2<<c3<<c4<<r1<<r2<<r3<<r4<<endl;
     
        return 0;
    }

  14. #14
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Par défaut
    Citation Envoyé par debuteenc Voir le message
    je pense que le fait que je ne puis pas modifier la procédure " afficher " t'a échappé.
    Comment le deviner si tu ne le précises nul part ?

    Il suffit d'appeler ta fonction afficher_couleurs() comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string c= "abcd";
    afficher_couleurs(c[0], c[1], c[2], c[3]);
    Voilà, il faut vraiment être précis dans tes demandes sinon ça part dans tous les sens. Il y a 90 000 façons de faire les choses en C++. Et encore, ça c’est sans compter la manière @foetus, parce que sinon ça fait 90 001

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 144
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par debuteenc Voir le message
    je connais pas les termes c++ class, public, ostream, friend, private et j'en passe...Je constate amèrement que le cours que je suis (d'une grande école...) c'est de la daube! Je vais arrêter de le suivre!
    Que puis-je faire, à votre avis, pour progresser...valablement?
    Ouvrir un livre ou lire n'importe quel article en ligne.
    Tu es meme pas au niveau 0, tu ne connais même pas les mot-clés les plus basiques.

    Plus que lourd, ton code est inutile comme le montre très bien Kaitlyn.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Octobre 2021
    Messages : 31
    Par défaut
    ...Je remercie Bousk pour ses encouragements, sa diligence et sa gentillesse. kaitlyn, je ne peux rien modifier à la fonction " afficher_couleurs ", et c'est bien là mon malheur! Sinon, je ne m'embêterai pas à trouver des solutions boiteuses...J'ai l'obligation de travailler avec des char...
    Pas de souci, mon code fonctionne et l'exercice est terminé. Merci d'avoir pris du temps pour moi.
    Amitiés

    J-P

  17. #17
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    À dire que dans quelques années ça sera une bête en c, c'est émouvant.

  18. #18
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Octobre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Octobre 2021
    Messages : 31
    Par défaut
    Cher baragouine, je me passe volontiers de vos sarcasmes et moqueries! Et, comme dit l'adage, la bave du crapaud n'atteint pas la blanche colombe...Denis Ramond edts. Payot

  19. #19
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 108
    Par défaut
    Citation Envoyé par debuteenc Voir le message
    Cher baragouine, je me passe volontiers de vos sarcasmes et moqueries! Et, comme dit l'adage, la bave du crapaud n'atteint pas la blanche colombe...Denis Ramond edts. Payot
    Je ne me moque pas, sérieusement dans quelques années tu seras une bête et quand on voit d'où les gens sont partis c'est impressionnant.

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

Discussions similaires

  1. [DEBUTANT] String et char, bug
    Par FinalSpirit dans le forum Débuter
    Réponses: 15
    Dernier message: 10/01/2006, 18h42
  2. Borland + sqlite (aducom) + string > 256 char = pas conte
    Par spyroux dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/12/2005, 22h48
  3. Evaluation d'une variable string ou char* en C++
    Par Coelacanthe dans le forum SL & STL
    Réponses: 2
    Dernier message: 08/11/2005, 09h27
  4. Convertir String en Char: comment?
    Par nmathon dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2005, 20h58
  5. [Debutant(e)]limitation du String 65536 char
    Par srane dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 28/05/2004, 23h42

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