我正在尝试实现一个应用程序,我希望用户在命令行上输入重音字符。我要做的是将char数组转换为wstring的向量。
我在Linux上。
这是我到目前为止得到的:
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
std::vector<std::wstring> parse_args(int argc, const char* argv[]){
std::vector<std::wstring> args;
for(int i = 0; i < argc - 1; ++i){
auto raw = argv[i+1];
wchar_t* buf = new wchar_t[1025];
auto size = mbstowcs(buf, raw, 1024);
args.push_back(std::wstring(buf, size));
delete[] buf;
}
return std::move(args);
}
int main(int argc, const char* argv[]){
auto args = parse_args(argc, argv);
for(auto& arg : args){
std::wcout << arg << std::endl;
}
}
它对普通字符按预期工作,但对重音字符不起作用。例如,如果我这样做:
./a.out Ménage
它崩溃了:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
[1] 30564 abort ./a.out Ménage
异常来自 wstring 的构造函数,因为 size = 18446744073709551615 (size_t - 1 我认为) 这似乎表明存在意外字符。
我不明白它出了什么问题?
我做错了什么?
编辑:情况会更好
如果我添加
setlocale(LC_ALL, "");
在程序开始时,它不会崩溃,但会输出一个奇怪的字符:
M�nage
现在我的控制台可能有问题吗?