C ++ char ** -> vector <string>-> string -> char ** проблема разбора - PullRequest
0 голосов
/ 12 октября 2009

Допустим, я пытаюсь решить проблему разбора строки на символ ** По какой-то причине приведенный ниже код создает много мусора, может кто-нибудь взглянуть на него, пожалуйста?

  1. Вот что он должен делать:
  2. Сбросить все argv в string_array контейнер
  3. Дамп всего в string_array контейнер в std :: string и разделить пробелами
  4. Разбейте строку на строку токены, использующие буст / алгоритм / строку
  5. создайте новый символ ** и сбросьте все токены в него, распечатать новый символ **, очистить

Что я сделал не так?

#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;
}

1 Ответ

4 голосов
/ 12 октября 2009

Строки в стиле C (char*) должны заканчиваться нулем. Поэтому вместо new char[tokens[i].size()] вам нужно добавить 1 к выделению: new char[token[i].size() + 1]. Кроме того, вам нужно установить new_args[i][tokens[i].size()] = 0 для завершения строки нулем.

Без нулевого терминатора программы не будут знать, когда прекратить печать, поскольку char* не содержит длину строки, в отличие от std::string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...