2009-10-12 59 views
0

可以说我试图解决字符串的解析问题char ** 由于某种原因,下面的代码会产生很多垃圾,谁可以看看吗?C++ char ** - > vector <string> - > string - > char **解析问题

  1. 下面是它应该做的事:
  2. 转储全部的argv成string_array 容器
  3. 转储在string_array 容器一切都变成的std :: string和 用空格
  4. 打破字符串放入字符串 使用增强/算法/字符串的令牌
  5. 创建一个新char **并将所有 标记转储到它中,打印出新的char **,clea n up

我做了什么错了?

#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

哪里和如何出错? – Mark 2009-10-12 15:59:50

+2

另外,new_args的内存释放不正确。在一个循环中,你也必须删除new_args [i] – 2009-10-12 16:01:45

+0

@aJ:大部分是正确的,但也必须使用删除的数组形式来删除'new_args [i]'。 :-) – 2009-10-12 16:06:45

回答

4

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

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

+1

从技术上讲,应该是“零终止”,以免有人开始用'0'而不是'\ 0'来终止它们的字符串。 – 2009-10-12 16:02:38

+0

那么,零意味着'(char)0',而不是''0''。但是我听到你在说什么。我不喜欢使用“null-terminated”,因为它会导致人们将NULL(指针)和NUL(字符)混合在一起,并且在他们表示NUL时开始编写NULL而不是0,在我看来,这非常不冷。建议欢迎。 – 2009-10-12 16:04:56

+0

这样做,欢呼! – Maciek 2009-10-12 17:34:55

相关问题