将字符串转换为char **

时间:2015-04-21 14:18:45

标签: c++ arrays char

我的代码有问题,我不知道什么是错的:(

我想将字符串转换为char *数组并在最后打印出来。

输出目前是我输入的句子的最后一个单词的3倍。

void parse(std::string &s, char **argv)
{
    std::istringstream iss(s);
    std::string tmp;

    while(iss >> tmp)
    {             
        *argv++ = (char*) tmp.c_str();        
    }  
}

int main()
{ 
    std::string input;  

    while (1) 
     {                             
        std::getline(std::cin, input);

        int argCount = countArgs(input);

        char  *argv[argCount];

        parse(input, argv);        

        for(int i=0; i<argCount; ++i)
        {
            std::cout << argv[i] << std::endl;
        }                      
    }   
     return 0;
}

2 个答案:

答案 0 :(得分:2)

我不知道为什么你当前的代码不起作用,因为你所做的事情基本上不是真正安全/善良/理智的事情。请重新考虑你的方法。

如果您可以使用char*,为什么要使用string

如果可能,而不是

char  *argv[argCount];
...
void parse(std::string &s, char **argv)
...
*argv++ = (char*) tmp.c_str();

使用

string argv[argCount];
...
void parse(std::string &s, string* argv)
...
*argv++ = tmp;

它几乎与你现在拥有的相同,&#34;只是&#34;使用不同的数据类型。

然而,请注意,这一切仍然不是真正的C ++,因为您使用string argv[argCount];非常量argCount。我很惊讶你的编译器实际编译它,你必须使用一些C兼容性编译标志。您应该使用std::vectorstd::list来保留&#34;可变长度的数组&#34;。

答案 1 :(得分:1)

在保存strdup()之前,您可以通过致电char *来避免评论中提到的问题:

void parse(std::string &s, char **argv)
{
    std::istringstream iss(s);
    std::string tmp;

    while(iss >> tmp)
    {             
        *argv++ = strdup( tmp.c_str() );        
    }  
}

您以后需要免费(而不是delete())这些副本。

for (int i = 0; i < argCount; ++i)
{
  std::cout << argv[i] << std::endl;
  free( argv[i] );
}