gpt4 book ai didi

c++ - 将 token 转换为 char* const* 时,使用 boost 对字符串进行 token 化失败

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:39 24 4
gpt4 key购买 nike

我正在使用 boost::tokenizer 在 C++ 中标记字符串,然后我想将它传递给 execv

考虑以下代码片段(可编译):

#include <iostream>
#include <cstdlib>
#include <vector>
#include <boost/tokenizer.hpp>

// I will put every token into this vector
std::vector<const char*> argc;
// this is the command I want to parse
std::string command = "/bin/ls -la -R";


void test_tokenizer() {
// tokenizer is needed because arguments can be in quotes
boost::tokenizer<boost::escaped_list_separator<char> > scriptArguments(
command,
boost::escaped_list_separator<char>("\\", " ", "\""));
boost::tokenizer<boost::escaped_list_separator<char> >::iterator argument;
for(argument = scriptArguments.begin();
argument!=scriptArguments.end();
++argument) {

argc.push_back(argument->c_str());
std::cout << argument->c_str() << std::endl;
}

argc.push_back(NULL);
}

void test_raw() {
argc.push_back("/bin/ls");
argc.push_back("-l");
argc.push_back("-R");

argc.push_back(NULL);
}

int main() {
// this works OK
/*test_raw();
execv(argc[0], (char* const*)&argc[0]);
std::cerr << "execv failed";
_exit(1);
*/

// this is not working
test_tokenizer();
execv(argc[0], (char* const*)&argc[0]);
std::cerr << "execv failed";
_exit(2);
}

当我运行此脚本时,它会调用 test_tokenizer(),它会打印“execv failed”。 (尽管它很好地打印了参数)。

但是,如果我将 test_tokenizer 更改为 test_raw,它运行良好。

这一定是一些简单的解决方案,但我没有找到。

PS.: 我也把它放到了一个支持 boost 的在线编译器中 here .

最佳答案

boost::tokenizer在 token 迭代器中按值(默认情况下为 std::string )保存 token 。

因此argument->c_str()的字符数组当迭代器被修改并且它的生命周期将以argument结束时指向可能被修改或失效。最迟。

因此,当您尝试使用 argc 时,您的程序会出现未定义的行为。 .

如果你想继续使用boost::tokenizer ,我建议将 token 保存在 std::vector<std::string> 中然后将它们转换为指针数组。

关于c++ - 将 token 转换为 char* const* 时,使用 boost 对字符串进行 token 化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57981872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com