在运行时更改const wchar_t*

changing const wchar_t* during runtime

本文关键字:wchar const 运行时      更新时间:2023-10-16

我使用std::cin收到一个字符串,我试图将常量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变量是什么,我只知道我使用的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;

您可以从一开始就读取宽字符,而不是转换字符串。使用std::wcin读取,使用std::wcout打印宽字符。您可以将文本保留为std::wstring,并在调用需要const wchar_t*的函数时使用c_str()

void function1(const wchar_t*);
void function2() {
std::wstring str;
getline(std::wcin, str);
std::wcout << str;
function1(str.c_str());
}

两个问题:

1( 潜在的问题是如何将窄字符串转换为宽字符串。当你转换ASCII dll名称时,一切都很好(或者不好?我想只是在实践中?(。否则就会有龙。转换为宽字符很难:你应该知道窄编码(UTF-8?系统编码?(,宽字符编码在不同的平台上也不同(Windows上的USC-2或UTF-16,Linux上的UTF-32,本机端序(。但这是另一种担忧。

2( 正确答案(@Ville Valtteri提到(是不能将const wchar*输出到std::coutcout把它当作一个指针,而这个00007FF6A958CAF0就是一个指针值。这不是你想要的。也许您想写入std::wcout,或者转换回窄字符串;您需要什么取决于实际的真实代码。