如何将 std::vector<std::string> 作为字符**传递?
How to pass std::vector<std::string> as char**?
我正在尝试复制char *argv[]
,以便我可以将它们传递给需要char**
的函数。首先,我必须从原始argv
中删除一些标志:
int main(int argc, char* argv[]) {
::MessageBox(0,"Stopped at the entry point",0,0);
std::string inChannelParam = "--ipc-in-channel";
std::string outChannelParam = "--ipc-out-channel";
std::string inChannelName;
std::string outChannelName;
std::vector<std::string> argv_copy;
for(int i=0; i<argc; ++i) {
if(inChannelParam == argv[i]) {
if(++i < argc) {
inChannelName = argv[i];
continue;
}
} else if(outChannelParam == argv[i]) {
if(++i < argc) {
outChannelName = argv[i];
continue;
}
}
argv_copy.push_back(argv[i]);
}
std::vector<std::unique_ptr<char[]> > argv_copy_char;
for(int i=0;i<argv_copy.size();++i) {
argv_copy_char.push_back(std::unique_ptr<char[]>(new char[argv_copy[i].size()+1]));
memcpy(argv_copy_char[i].get(), &argv_copy[i][0], argv_copy[i].size());
argv_copy_char[i][argv_copy[i].size()] = ' ';
}
// what should i put here ?? --------------------vvv
v8::V8::SetFlagsFromCommandLine(&argc, &(argv_copy_char[0].get()), true);
我尝试了基于字符串和字符 [] 的方法。它给出了编译器错误:
error C2102: '&' requires l-value
使用&(argv_copy_char[0]._Myptr)
会给我运行时错误
if (arg != NULL && *arg == '-') {
在flags.cc
.
函数 SetFlagsFromCommandLine 的签名是
SetFlagsFromCommandLine (int *argc, char **argv, bool remove_flags)
.
我该怎么办?
您已经构造并填充了字符串向量:std::vector<std::string> argv_copy;
但是
我不明白你为什么决定使用这个向量来创建另一个包含 unique_ptr<char[]>
类型元素的向量:
std::vector<std::unique_ptr<char[]> > argv_copy_char;
另请注意,v8::V8::SetFlagsFromCommandLine
的原型是:
static void SetFlagsFromCommandLine (int *argc, char **argv, bool remove_flags)
。在这里公开矢量的内部并不是一个很幸运的想法,因为argv_copy
包含 std::string
类型的对象......然而 API 需要 char**
,所以你可以做的是动态分配和填充一个临时的 C 样式指针数组到这些字符串:
// temporary C-style array
int myArgvSize = argv_copy.size();
char* myArgv[] = new char* [myArgvSize];
for (int i = 0; i < myArgvSize; ++i)
myArgv[i] = &argv_copy[i][0];
v8::V8::SetFlagsFromCommandLine(&myArgvSize, myArgv, true);
// cleanup:
delete[] myArgv;
请注意,此解决方案依赖于SetFlagsFromCommandLine
不会修改这些字符串的长度这一事实。
为什么SetFlagsFromCommandLine
会得到一个指向整数的指针? 是否需要更改整数?我不明白为什么要传递指向它的指针。
此外,问题似乎在完全不同的地方,因此您共享的代码没有多大帮助
最后,查看您遇到错误的行。请检查:
- 什么是
arg
?它被定义了吗? arg
可以为空吗?arg
是指针还是数组?
SetFlagsFromCommandLine
看起来像一个相当特殊的函数对我来说,它似乎期望argc
和argv
参数,并修改它们(大概是通过删除选项)。如果可能的话,我会先打电话给它,用argc
和 argv
,之后做我的特殊处理。 修改可能以argv
中移动指针的形式发生向下,这意味着任何使用 std::vector
的解决方案都将调用函数后需要一些额外的处理。
如果您无法更改处理顺序(例如,因为 --ipc-in-channel
及其参数可能由 SetFlagsFromCommandLine
),那么你可能需要一些东西如下所示(在解析参数后):
std::vector<char*> tmp;
for ( auto current = argv_copy.begin();
current != argv_copy.end();
++ current ) {
tmp.push_back( current->empty ? "" : &(*current)[0] );
}
int argc_copy = tmp.size();
SetFlagsFromCommandLine( &argc_copy, &tmp[0] );
if ( argc_copy != argv_copy.size() ) {
auto dest = argv_copy.begin();
auto src = tmp.begin();
while ( dest != argv_copy.end() ) {
if ( (*src)[0] == ' ' ) {
if ( *dest != "" ) {
++ dest ;
} else {
while ( dest != argv_copy.end() && *dest != "") {
dest = argv.erase( dest );
}
}
} else {
if ( !dest->empty() && &(*dest)[0] == *src ) {
++ dest;
} else {
while( dest != argv_copy.end()
&& (dest->empty() || &(*dest)[0] != *src) ) {
dest = argv.erase( dest );
}
}
}
}
assert( argv_copy.size() == argc_copy );
}
这只是我的头顶,可能包含一些错误,但它给出了一个必要的努力的想法,如果你不能先呼叫SetFlagsFromCommandLine
。
编辑:
或者,虽然有点痛苦,但你可以以完全相同的方式处理argc
和argv
SetFlagsFromCommandLine
内部做,而不把它们放进去在std::vector
:
int dest = 1;
int source = 1;
while ( source != argc ) {
if ( inChannelParam == argv[source] == 0 && source < argc - 1 ) {
inChannelName = argv[source + 1];
source += 2;
} else if ( outChannelPara == argv[source] == 0 && source < argc - 1 ) {
outChannelName = argv[source + 1];
source += 2;
} else {
argv[dest] = argv[source];
++ dest;
++ source;
}
}
argc = dest;
SetFlagsFromCommandLine( &argc, argv );
std::vector<std::string> argv_copy( argv, argv + argc );
与char**
等人打交道并不好玩,但既然你需要以后这种格式,可能比翻译更痛苦格式之间的多次。
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 从 std::vector<无符号字符>切片中提取 int?
- 字符转换功能 std::isupper() & std::islower() C++17
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 为什么 std::string_view 比常量字符*快?
- std::stringstream 返回字符 *
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- 在 std::vector<无符号字符中存储任意数据的方法>
- 为什么从 std::cin 读取输入后右括号字符的值有时不是")"?
- "std::string"是否将其字符作为签名字符在内部存储?
- std::stoi 只转换前几个字符
- std::可选实现为联合与字符[]/aligned_storage
- C++ 无法将 std::vector<BYTE> 转换为字符串或字符数组
- 如何使用 std::copy 当类有"无符号字符和运算符[]"时
- C++ 从 std::string 中删除所有非数字字符
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组