これは私のコードで、文字列のベクトルをwchar_t **に変換しようとしています。 3行目をコメントアウトして4行目のコメントを外すと、それは動作します。しかし、私はwchar_t **を持続させたいので、私は3番目の行を使いたいが、4番目の行は使いたくない。 3行目が期待通りに動作しない理由を私に説明してください。ベクトル<string>からwchar_tへの変換**
0
A
答えて
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");
}
2
あなたはnew wchar_t[size]
を割り当て、それにsize + 1
文字をコピーしています。それは未定義の動作です。
関連する問題
- 1. intからwchar_tへの無効な変換
- 2. スカライテレータからベクトルへの変換
- 3. 'const wchar_t'から 'std :: ctype <char> :: _ Elem'への変換、データ損失の可能性あり
- 4. ベクトル<Mat>をベクトル<float>に変換しますか?
- 5. のconst char型へのwchar_t *に変換する方法*
- 6. ベクトルから文字シーケンスへの変換のためのLSTM
- 7. C++のデータ構造:TNTベクトルからGL vec3への変換
- 8. 添字から行列への変換をベクトル化する
- 9. 多次元配列から1次元ベクトルへの変換
- 10. 演算子wchar_t **()はconst wchar_tへの暗黙的な変換を提供できません** - なぜですか?
- 11. Wchar_tの置換
- 12. 「ベクトル::はstdするintへ<int> :: size_type変換」
- 13. jspの "<"から "<"への変換を停止
- 14. OpenCV 2ベクトル<Point2i>をベクトルに変換<Point2f>
- 15. ベクトル<string>をベクトルに変換する方法<char*>
- 16. クラス<T>からタイプ参照への変換<T>
- 17. 'const wchar_t *'から '_TCHAR *'に変換できません
- 18. アルマジロのベクトルからキューブへの変更
- 19. shared_ptrでベクトルとクラスへの変換
- 20. NSStringからwchar_t *?
- 21. safe uint8_tをwchar_tに変換する
- 22. const wchar_t *をWCHARに変換する*
- 23. タプルのベクトルからタプルのベクトルへ
- 24. C++ std ::ペアのベクトル変換 - >最初から新しいベクトル
- 25. PySparkの密ベクトルから疎ベクトルに変換
- 26. firebaseからリストへのdatasnaphotの変換<Array> - Xamarin.Droid
- 27. C#からSQLへのBase64へのハッシュ変換と変換
- 28. 'int'から 'nodeType <int>'への無効な変換
- 29. stdコンテナからベクタ<unsigned char>(バイナリデータ)とバックへの変換
- 30. 文字列から<T>への変換
何が問題になるのですか? – pm100
問題を説明してください。 3行目のコメントを外したときにはどうなりますか? –
デバッガを使ってコードをステップ実行すると、argv [0]がelems [0]に設定されていることがわかりますが、0からargc、argv [1]、argv [2]更新しました。 –