在运行时更改const wchar_t*
changing const wchar_t* during runtime
我使用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::cout
。cout
把它当作一个指针,而这个00007FF6A958CAF0
就是一个指针值。这不是你想要的。也许您想写入std::wcout,或者转换回窄字符串;您需要什么取决于实际的真实代码。