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

Langage C++ Discussion :

Convertir char* en string sous Linux ?


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Par défaut Convertir char* en string sous Linux ?
    Bonjour,

    J'ouvre ce topic car j'ai un nouveau soucis que je suis incapable de régler seul.
    Nous avons développé un petit programme qui prend quelques arguments en ligne de commande, pour gérer cela, j'utilise la fonction getopt. Celle ci se contente de donner un traitement et un accès simplifié aux arguments.

    Ceux ci sont renvoyés en tant que char *.

    Nous développons sous windows, avec codeblocks, et compile avec mingw.

    Le code récupère les arguments de la ligne de commande et les met dans des string, ainsi il fait:

    string toto = optarg
    string tata = argv[optind]
    etc ....

    Problème, une fois sous linux (compilation avec gcc), ceci génère à l'exécution une erreur logique.
    On a pu identifier que l'erreur logique survient exactement lors de l'instanciation de la chaine de caractère a partir du char *.

    On a bien essayé:
    char * totoch = optarg;
    string toto(optarg) // string* toto = new string(optarg)

    Mais rien n'y fait.

    Je n'ai aucun moyen de développer avec un IDE sous Linux, et de débugger sous Linux, on fait tout en ligne de commande (avec des makefile pour la compilation).
    Aussi si une personne expérimentée pouvait nous aider sur ce coup là, ça serait vraiment apprécié

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 035
    Billets dans le blog
    12
    Par défaut
    Ton char * ne serait-il pas NULL, par hasard ?
    Sinon, finit-il bien par un \0 ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Par défaut
    Non le char n'est pas NULL ça c'est certain.
    Enfin, en tous cas il n'est pas NULl quand je lance le programme sous windows, car le programme fonctionne parfaitement.

    Pour le \0 c'est une très bonne question, j'avoue que je suis parti du principe que le char* crée par getopt l'avait forcément .... je vais en rajouter un d'office... si je me rappelle comment rajouter un caractère à un char*

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Par défaut
    A priori cela ne vient pas du \0 ;(

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Par défaut
    Bonjour,

    Je viens de constater que les compilateurs qui nous sont fournis sous LINUX sont gcc en version 4.3.0 (avril 2008).
    Sur chacun de nos exercices nos rencontrons des problèmes de non fonctionnement.

    De mon côté je compile les programmes avec gcc 4.5.2 directement sous windows mais également avec minSYS mais du coup, je suis incapable de faire une compilation linux et une exécution avec le bon compilateur !
    Merci !

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string tata = argv[optind]
    optind<argc ?? C'est vérifié partout ?


    Peux-tu simplement poster le code d'analyse de ton argv/argc et la construction de tes chaînes de caractère. Car là tu ne fournis pas assez de code pour vraiment se rendre compte.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Par défaut
    J'ai pas bien compris le truc la
    Pourquoi un cast static marcherai pas?
    string s = static_cast<string>(argv[index])
    Le souci c'est quoi exactement?

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    personne n'a parlé de static_cast Ca ne sert à rien.
    Ton main doit ressembler à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char* argv[])
    argc indique combien il y a d'éléments valide dans le tableau argv
    Donc quand tu écris : string tata = argv[optind] il faut que optind<argc

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string tata = argv[optind]
    optind<argc ?? C'est vérifié partout ?


    Peux-tu simplement poster le code d'analyse de ton argv/argc et la construction de tes chaînes de caractère. Car là tu ne fournis pas assez de code pour vraiment se rendre compte.
    Oui, le code fonctionne parfaitement, c'est au moment de la construction que cela plante. Et on a essayé de récupérer le optarg dans un char *.
    C'est clairement identifié mais voici le code du main:

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
     
    #include <getopt.h>
    #include <iomanip>
    #include "Encryption.h"
    #include <string>
    #include <string.h>
    #include <iostream>
    #include <fstream>
     
    int main(int argc, char* argv[])
    {
        int c;
        bool isH = false;
        bool isD = false;
        bool isC = false;
        bool errFlag = true;
     
        //la boucle while avec getopt permet de lire l'option choisi par l'utilisateur
        while ((c = getopt(argc, argv, "hd:c:")) != EOF)
        {
            switch((char) c)
            {
                //l'option -h est pour afficher les options disponibles par le programme
            case 'h':
     
                isH = true;
                errFlag = false;
                break;
     
                //l'option -d permet de décripter un fichier entrant : "fichier_sec.txt"
            case 'd':
                if (!isH && argc >= 4)
                {
                    isD = true;
                    errFlag = false;
                }
                break;
     
                //l'option -c permet de crypter un fichier entrant : "fichier.txt"
            case 'c':
                if (!isH && argc >= 4)
                {
                    isC = true;
                    errFlag = false;
                }
                break;
     
                //si l'option choisi par l'utilisateur est autre que -h, -d ou -c
            case '?' :
            default:
                errFlag = true;
            }
        }
     
        //si l'option choisie est -h : afficher les options disponibles par le
        //Ou s'il y a une erreur
        if(isH || errFlag)
        {
            cout << "les commandes utilisees dans ce programme sont : " << endl << endl;
            cout << setw(7) <<"-h : " << "pour affichier les commandes disponibles dans ce programme" << endl << endl;
            cout << setw(7) <<"-c : " << "pour crypter un fichier entrant dans un fichier sortant" << endl;
            cout << setw(7) << "" << setw(16) << "1er argument : " << "nom du programme" << endl;
            cout << setw(7) << "" << setw(16) << "2eme argument : " << "l'option (-c)" << endl;
            cout << setw(7) << "" << setw(16) << "3eme argument : " << "nom de la clef" << endl;
            cout << setw(7) << "" << setw(16) << "4eme argument : " << "nom du fichier a crypter" << endl;
            cout << setw(7) << "" << "[ex: exo01.exe -c programmation fichier.txt]" << endl << endl;
            cout << setw(7) <<"-d : " << "pour decrypter un fichier entrant dans un fichier sortant" << endl;
            cout << setw(7) << "" << setw(16) << "1er argument : " << "nom du programme" << endl;
            cout << setw(7) << "" << setw(16) << "2eme argument : " << "l'option (-d)" << endl;
            cout << setw(7) << "" << setw(16) << "3eme argument : " << "nom de la clef" << endl;
            cout << setw(7) << "" << setw(16) << "4eme argument : " << "nom du fichier a decrypter" << endl;
            cout << setw(7) << "" << "[ex: exo01.exe -d programmation fichier_sec.txt]" << endl << endl;
            return 0;
        }
        //si l'option choisie est -d : décrypter un fichier entrant
        else if (isD)
        {
            string cle = optarg;
            string inFichier = argv[optind];
            string outFichier;
            //Si aucune extention, rajoute de l'extention par défaut.
            if ((int) inFichier.find(".") == -1) inFichier = inFichier + ".txt";;
     
     
            //crée le nom du fichier décrypter sortant
            if((int) inFichier.find("_sec") != -1)
            {
                outFichier = inFichier.substr(0,inFichier.find("_")) + "_dec.txt";
            }
            //si le nom du fichier entrant ne contient pas les caractéristiques attendues
            else
            {
                cout << "le fichier d'entree d'un decrytage doit inclure _sec.txt a la fin";
                return 0;
            }
     
            //ouvre les fichier entrant et sortant
            ifstream in(inFichier.c_str(), ios::in);
            ofstream out(outFichier.c_str(), ios::out | ios::trunc);
     
            //si les fichiers entrant et sortant ne souvre pas correctement
            if (in.fail())
            {
                cout << "erreur a l'ouverture du fichier entrant" << endl;
                return 0;
            }
     
            if (out.fail())
            {
                cout << "erreur a l'ouverture du fichier sortant" << endl;
                return 0;
            }
     
            //crée une instance de la classe encryption et lance la méthode decrypt
            Encryption* encrypt = new Encryption(cle);
            encrypt->decrypt(in, out);
     
            //ferme les fichier entrant et sortant et delete l'instance de la classe encryption
            in.close();
            out.close();
            delete(encrypt);
     
            cout << "Decryptage termine" << endl;
            return 0;
     
        }
        //si l'option choisi est -c : crypter un fichier entrant
        else if (isC)
        {
            string cle= optarg;
            string inFichier = argv[optind];
     
            //Si aucune extention, rajoute de l'extention par défaut.
            if ((int) inFichier.find(".") == -1) inFichier = inFichier + ".txt";
     
            //crée le nom du fichier crypter sortant
            string outFichier = inFichier.substr(0,inFichier.find(".")) + "_sec.txt";
     
            //ouvre les fichier entrant et sortant
            ifstream in(inFichier.c_str(), ios::in);
            ofstream out(outFichier.c_str(), ios::out | ios::trunc);
     
            //si les fichiers entrant et sortant ne souvre pas correctement
            if (in.fail())
            {
                cout << "erreur a l'ouverture du fichier entrant" << endl;
                return 0;
            }
     
            if (out.fail())
            {
                cout << "erreur a l'ouverture du fichier sortant" << endl;
                return 0;
            }
     
            //crée une instance de la classe encryption et lance la méthode crypt
            Encryption* encrypt = new Encryption(fiécle);
            encrypt->crypt(in, out);
     
            //ferme les fichier entrant et sortant et delete l'instance de la classe encryption
            in.close();
            out.close();
            //delete(encrypt);
     
            cout << "Cryptage termine" << endl;
            return 0;
        }
    }
    Pour l'info finalement notre remise sera testée sous windows donc plus de problème mais j'aimerais bien comprendre quand même si c'est lié au compilateur (testé avec gcc 4.4.? et ça plante aussi), ou a autre chose

    Ici l'exécution sous LINUX:

    Taille du fichier 255
    -VirtualBox:~/Test$ ./exo02 -c Programmation fichierUnix.txt
    terminate called after throwing an instance of 'std::logic_error'
    what(): basic_string::_S_construct NULL not valid
    Abandon
    -VirtualBox:~/Test$
    On a épuré les cout mais chaque ligne de code était encadré pour déterminer précisément la ligne de plantage.

Discussions similaires

  1. Convertir char ou String en Int
    Par Invité(e) dans le forum ASP
    Réponses: 2
    Dernier message: 10/06/2008, 16h17
  2. Convertir Char* en String
    Par Blunt dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/07/2007, 16h46
  3. Convertir char* en string
    Par KorTeX22 dans le forum C++
    Réponses: 5
    Dernier message: 13/03/2007, 11h54
  4. convertir un char * en string
    Par Seij dans le forum C++
    Réponses: 5
    Dernier message: 08/03/2006, 22h23
  5. Réponses: 12
    Dernier message: 31/01/2006, 21h46

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