3

ユーザーがコマンドラインでアクセント記号付きの文字を入力できるようにするアプリケーションを実装しようとしています。私がやろうとしているのは、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

size = 18446744073709551615 (size_t - 1 だと思います) であるため、例外は wstring のコンストラクターから発生します。これは、予期しない文字があることを示しているようです。

何が悪いのかわかりませんか?

私が間違っていることは何ですか?

編集:それは良くなっています

追加すると

setlocale(LC_ALL, "");

プログラムの開始時に、クラッシュはしませんが、奇妙な文字が出力されます:

M�nage

今のコンソールに問題があるのでしょうか?

4

1 に答える 1