我有一个使用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;
答案 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::cout
。 cout
将其视为指针,而您得到的00007FF6A958CAF0
是指针值。这不是您想要的。也许您想写std :: wcout,或者转换回窄字符串;您需要什么取决于您的实际真实代码。