2017-07-07 10 views
0

これは私のコードで、文字列のベクトルをwchar_t **に変換しようとしています。 3行目をコメントアウトして4行目のコメントを外すと、それは動作します。しかし、私はwchar_t **を持続させたいので、私は3番目の行を使いたいが、4番目の行は使いたくない。 3行目が期待通りに動作しない理由を私に説明してください。ベクトル<string>からwchar_tへの変換**

+0

何が問題になるのですか? – pm100

+0

問題を説明してください。 3行目のコメントを外したときにはどうなりますか? –

+0

デバッガを使ってコードをステップ実行すると、argv [0]がelems [0]に設定されていることがわかりますが、0からargc、argv [1]、argv [2]更新しました。 –

答えて

1

あなたはこのようにwstringの文字列から変換することができます:

std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv; 
auto warg = cv.from_bytes(arg); 
auto wargv = warg.c_str(); // wchar_t* 

しかし、あなたはまた、代わりにint型とのwchar_t **のベクトルを渡す検討することがあります。

std::vector<std::wstring> args; 
for(auto& elm : elms) 
{ 
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv; 
    args.push_back(cv.from_bytes(elm)); 
} 
0

これは基本的に改造され答えfound here

基本的には、std::vector<wchar_t*>(文字ポインタのベクトルを使用するのは数回のうちの1つ)であり、それをwchar_t**を必要とする関数に送信しました。

#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <string> 
#include <sstream> 

class CommandLine 
{ 
    typedef std::vector<wchar_t> CharArray; 
    typedef std::vector<CharArray> ArgumentVector; 
    ArgumentVector argvVec; 
    std::vector<wchar_t *> argv; 
public: 
    CommandLine(const std::string& cmd); 
}; 

void my_command_line(int numArgs, wchar_t** args); 

CommandLine::CommandLine(const std::string& cmd) 
{ 
    std::string arg; 
    std::istringstream iss(cmd); 
    while (iss >> arg) 
    { 
     size_t length = 0; 
     CharArray cArray(arg.size() + 1); 

     mbstowcs_s(&length, cArray.data(), arg.size() + 1, arg.c_str(), arg.size()); 

     argvVec.push_back(CharArray(arg.begin(), arg.end())); 

     // make sure we null-terminate the last string we added. 
     argvVec.back().push_back(0); 

     // add the pointer to this string to the argv vector 
     argv.push_back(argvVec.back().data()); 
    } 

    // call the alternate command-line function 
    my_command_line(argv.size(), argv.data()); 
} 

void my_command_line(int numArgs, wchar_t** args) 
{ 
    for (int i = 0; i < numArgs; ++i) 
     std::wcout << "argument " << i << ": " << args[i] << std::endl; 
} 

int main() 
{ 
    CommandLine test("command1 command2"); 
} 

Live Example

2

あなたはnew wchar_t[size]を割り当て、それにsize + 1文字をコピーしています。それは未定義の動作です。

関連する問題