在运行时更改const wchar_t *

时间:2019-11-14 12:14:20

标签: c++

我有一个使用std :: cin接收到的字符串,并且我试图将const wchar_t *更改为该变量

const wchar_t* TARGET_FILE = L"";
try {
    std::string str;
    std::cout << "DLL Name: ";
    getline(std::cin, str);
    //TARGET_FILE = str;
    std::string narrow_string(str);
    std::wstring wide_string = std::wstring(narrow_string.begin(), narrow_string.end());
    const wchar_t* result = wide_string.c_str();
    const wchar_t* TARGET_FILE = result;
    std::cout << TARGET_FILE; //Debug

}
catch (const std::exception & ex) {
    std::cout << "[ERROR] " << ex.what() << '\n';
    std::cout << "Press any key to exit..." << '\n';
    std::cin.get();
    return EXIT_FAILURE;
}

执行此代码后会发生这种情况

DLL Name: Kinky.dll
0000020E11C61560[ERROR] DLL not found.
Press any key to exit...

当我使用

对TARGET_FILE的值进行硬编码时,我得到0000019CCB971300而不是有效的文本格式
//constexpr auto TARGET_FILE      = L"Kinky.dll";

对不起,如果我有点愚蠢,但是我对wchar_t vars不是很熟悉,我只是知道我使用的sdk需要一个

编辑: 我粘贴了此部分以尝试解决原始问题,因此idk如果它的用法正确(如果它的用法不正确,那么我希望这是我的问题)

std::string narrow_string(str);
std::wstring wide_string = std::wstring(narrow_string.begin(), narrow_string.end());
const wchar_t* result = wide_string.c_str();
const wchar_t* TARGET_FILE = result;

2 个答案:

答案 0 :(得分:5)

代替转换字符串,您可以阅读宽字符。使用prime_numbers = "20000" cmd = 'sysbench --test=cpu --cpu-max-prime={} --num-threads=2 run'.format(prime_numbers) # --> sysbench --test=cpu --cpu-max-prime=20000 --num-threads=2 run 进行读取,并使用std::wcin打印宽字符。您可以将文本保留为std::wcout,并在调用需要std::wstring的函数时使用c_str()

const wchar_t*

答案 1 :(得分:2)

两个问题:

1)潜在的问题是如何将窄字符串转换为宽字符串。当您转换ASCII dll名称时,一切都很好(或者不行?我只能在实践中猜测吗?)。否则会有龙。转换为宽字符很困难:您应该以某种方式知道窄编码(UTF-8?系统编码?),在不同平台上(Windows上是USC-2或UTF-16,Linux上是UTF-32,本地字节序)。但这是另外一个问题。

2)正确答案(由@ Ville-Valtteri提及)是您无法将const wchar*输出到std::coutcout将其视为指针,而您得到的00007FF6A958CAF0是指针值。这不是您想要的。也许您想写std :: wcout,或者转换回窄字符串;您需要什么取决于您的实际真实代码。