将字符串转换为字符**

Converting string to char**

本文关键字:字符 转换 字符串      更新时间:2023-10-16

>我的代码有问题,我不知道出了什么问题:(

我想将字符串转换为 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;
}

我不会详细说明为什么您当前的代码不起作用,因为您正在做的事情基本上不是真正安全/良好/理智的事情。请重新考虑您的方法。

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

如果可能,而不是

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;

它将与您现在的工作方式几乎相同,"只是"使用不同的数据类型。

但是,请注意,这一切仍然不会真正C++,因为您正在使用带有非常量argCountstring argv[argCount];。我很惊讶你的编译器实际上编译了它,你一定使用了一些 C 合规性编译标志。您应该使用 std::vectorstd::list 来保留"可变长度数组"。

您可以通过在保存char *之前调用strdup()来避免注释中提到的问题:

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] );
}