我在Linux上有一个main(),它接收命令行参数作为char**
int main(int argc ,char * argv[])
在我的跨平台程序中,我想使用命令行参数char16_t。因此,我需要转换char->char16_t。我该怎么做?我试过这样做,但是一旦我离开循环,我的调试器就会在数组中显示奇怪的字符。我做错了什么?**
//u16String <- string
std::u16string u16string_from_string(std::string const str) {
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter;
return converter.from_bytes(str);
}
bool convert_argv_to_char16(int argc,char * argv[]){
char16_t * argv16[argc];
int i=0;
// for each arg
for (char **arg = argv; *arg; ++arg) {
std::string S(*arg);
std::u16string S16 = u16string_from_string(S);
const char16_t* cc_16 = S16.c_str();
char16_t* c_16 = (char16_t*) cc_16;
argv16[i] = c_16;
i++;
}
return true;
}
1条答案
按热度按时间vhmi4jdf1#
要解决此问题,需要确保转换后的
std::u16string
对象的生存期超出convert_argv_to_char16函数。实现此目的的一种方法是使用std::vector<std::u16string>
存储转换后的参数。这样,vector将使std::u16string
对象保持活动状态,直到函数结束,您可以安全地将指针分配给argv16通过使用
std::vector<std::u16string>
存储转换后的参数,可以确保它们在整个函数范围内的有效性。一旦函数convert_argv_to_char16返回,vector中的std::u16string
对象将被销毁,但argv16数组不会持有指向无效内存的指针。