c++ 如何将命令行参数从char * argv[]转换为char16_t * argv[]

0lvr5msh  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(148)

我在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;
}
vhmi4jdf

vhmi4jdf1#

要解决此问题,需要确保转换后的std::u16string对象的生存期超出convert_argv_to_char16函数。实现此目的的一种方法是使用std::vector<std::u16string>存储转换后的参数。这样,vector将使std::u16string对象保持活动状态,直到函数结束,您可以安全地将指针分配给argv16

#include <vector>
#include <string>
#include <codecvt>

// u16String <- string
std::u16string u16string_from_string(const std::string& 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[]) {
    std::vector<std::u16string> argv16;

    // Convert each arg and store it in the vector
    for (int i = 0; i < argc; ++i) {
        std::u16string S16 = u16string_from_string(argv[I]);
        argv16.push_back(S16);
    }

    // Now you can use argv16 as char16_t* argv[]
    // For example, you can access the elements using argv16[i].c_str()

    return true;
}

通过使用std::vector<std::u16string>存储转换后的参数,可以确保它们在整个函数范围内的有效性。一旦函数convert_argv_to_char16返回,vector中的std::u16string对象将被销毁,但argv16数组不会持有指向无效内存的指针。

相关问题