0 votes

Problème d'analyse C++ char** -> vector<string> -> string -> char**

Disons que j'essaie de résoudre un problème d'analyse d'une chaîne de caractères vers un caractère **. Pour une raison quelconque, le code ci-dessous génère beaucoup de déchets, quelqu'un peut-il y jeter un coup d'œil s'il vous plaît ?

  1. Voici ce qu'il est censé faire :
  2. Dépose tous les argv dans un string_array conteneur
  3. Décharge tout ce qui se trouve dans le string_array dans un conteneur std::string et séparer par des espaces
  4. Cassez la ficelle en plusieurs parties en utilisant boost/algorithm/string
  5. créer un nouveau char ** et décharger tous les tokens, imprimez le nouveau char **, nettoyez-le.

Qu'ai-je fait de mal ?

#include <string>
#include <vector>
#include <iostream>

#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost;

typedef vector<string> string_array;

int main(int argc, char ** argv)
{
    string_array args;
    string_array tokens;
    cout << "Real arguments :" << endl;
    for(int i = 0; i < argc; i++)
    { cout << argv[i] << endl;}

    string arg = "";
    for(int i = 1; i < argc; i++)
    {
        args.push_back(argv[i]);
    }
    for(int i = 0; i < (int)args.size(); i++)
    {
        arg += args[i];
        if(i != (int)args.size() - 1)
            arg += " ";
    }

    split(tokens, arg, is_any_of(" "));

    char ** new_args = NULL;
    new_args = new char*[(int)tokens.size()];
    for(int i = 0; i < (int)tokens.size(); i++)
    { 
        new_args[i] = new char[(int)tokens[i].size()];
        for(int j = 0; j < (int)tokens[i].size(); j++)
        {
            new_args[i][j] = tokens[i][j];
        }
    }

    for(int i = 0; i < (int)tokens.size(); i++)
    { std::cout << new_args[i] << std::endl; }
    delete [] new_args;
}

4voto

Chris Jester-Young Points 102876

Chaînes de style C ( char* ) sont censés être terminés par zéro. Ainsi, au lieu de new char[tokens[i].size()] il faut ajouter 1 à l'allocation : new char[token[i].size() + 1] . Vous devez également définir new_args[i][tokens[i].size()] = 0 pour terminer la chaîne par un zéro.

Sans le terminateur zéro, les programmes ne sauraient pas quand arrêter l'impression, car char* ne contient pas de longueur de chaîne, contrairement à std::string .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X