2017-07-07 122 views
0
std::vector<std::string> elems = split(command, ' '); 
const int argc = elems.size(); 
wchar_t** argv = new wchar_t*[argc](); 
//wchar_t* argv[10]; 
for (int i = 0; i < argc; i++) { 
    const char* arg = elems[i].c_str(); 
    int size = strlen(arg); 
    size_t length = 0; 
    wchar_t* e = new wchar_t[size]; 
    mbstowcs_s(&length, e, size + 1, arg, size); 
    argv[i] = e; 
} 

這是我試圖將字符串矢量轉換爲wchar_t **的代碼。當我評論第三行並取消註釋第四行時,它可以工作。但是我希望我的wchar_t **能夠堅持下去,所以我想使用第三行而不是第四行。請向我解釋爲什麼第三行不能按預期工作。從矢量<string>轉換爲wchar_t **

+0

出了什麼問題? – pm100

+0

請描述您的問題。取消註釋第三行時會發生什麼? –

+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*>(有史以來使用過的字符指針向量的幾次之一),並將它發送到需要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字符進去。這是未定義的行爲。