C ++ char ** - &gt; vector <string> - &gt; string - &gt; char **解析问题</string>

时间:2009-10-12 15:55:58

标签: c++ boost

让我们说我正在尝试解决字符串到char的解析问题 出于某种原因,下面的代码会产生很多垃圾,有人可以看一下吗?

  1. 这是它应该做的:
  2. 将所有argv转储到string_array中 容器
  3. 转储string_array中的所有内容 容器变成std :: string和 与空格分开
  4. 将字符串分解为字符串 令牌使用boost / algorithm / string
  5. 创建一个新的char **并转储所有 标记到它,打印出新的字符**,清理
  6. 我做错了什么?

    #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 个答案:

答案 0 :(得分:4)

C风格的字符串(char*)意味着零终止。因此,您需要在分配中添加1而不是new char[tokens[i].size()],而不是new char[token[i].size() + 1]new_args[i][tokens[i].size()] = 0。此外,您需要将char*设置为零终止字符串。

如果没有零终结符,程序将不知道何时停止打印,因为std::string不包含字符串长度,与{{1}}不同。