2009-10-12 15 views
0

Disons que j'essaie de résoudre un problème d'analyse syntaxique de chaîne à caractère ** Pour une raison quelconque, le code ci-dessous génère beaucoup de poubelle, quelqu'un peut-il y jeter un coup d'œil s'il vous plaît?C++ char ** -> vecteur <string> -> string -> char ** problème d'analyse syntaxique

  1. Voici ce qu'il est censé faire:
  2. Dump tous argv dans un string_array contenant
  3. tout Dump dans le conteneur string_array dans un std :: string et avec des espaces
  4. Cassez les chaîne dans la chaîne jetons en utilisant boost/algorithme/chaîne
  5. créer un nouveau caractère ** et vider tous les jetons dedans, imprimer le nouveau caractère **, clea n up

Qu'est-ce que j'ai 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; 
} 
+0

Où et comment ça se passe mal? – Mark

+2

En outre, la libération de la mémoire de new_args n'est pas correcte. dans une boucle, vous devez également supprimer new_args [i] –

+0

@aJ: Correctement correct, mais aussi utiliser la forme array de delete pour supprimer 'new_args [i]'. :-) –

Répondre

4

chaînes de type C (char*) sont destinés à être zéro terminé. Donc, au lieu de new char[tokens[i].size()], vous devez ajouter 1 à l'allocation: new char[token[i].size() + 1]. En outre, vous devez définir new_args[i][tokens[i].size()] = 0 à zéro-terminer la chaîne.

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

+1

Techniquement, cela devrait être "terminé par zéro" de peur que quelqu'un commence à terminer ses chaînes avec '0' plutôt que '\ 0'. –

+0

Eh bien, zéro signifie '(char) 0', pas' '0''. Mais j'entends ce que tu dis. Je n'aime pas utiliser "null-terminé" car cela amène les gens à confondre NULL (pointeur) et NUL (le caractère), et commence à écrire NULL au lieu de 0 quand ils veulent dire NUL, ce qui n'est vraiment pas cool à mon avis. Suggestions bienvenues. –

+0

Ça l'a fait, applaudissements! – Maciek

Questions connexes