我的代码有问题,我不知道什么是错的:(
我想将字符串转换为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;
}
答案 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::vector
或std::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] );
}