私はコマンドラインツールを構築していますが、最初は行全体が文字列です。どうすれば変換できますか:
string text = "-f input.gmn -output.jpg";
の中へ
const char *argv[] = { "ProgramNameHere", "-f", "input.gmn", "-output.jpg" };
を使用する必要getopt
があり、空白で区切られたものから始めていることがわかっている場合はstd::string
、次のようにします。
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <cassert>
#include <cstring>
int main() {
https://stackoverflow.com/questions/236129/how-to-split-a-string-in-c
// My input
std::string sentence = "-f input.gmn -output.jpg";
// My input as a stream
std::istringstream iss(sentence);
// Create first entry
std::vector<std::string> tokens;
tokens.push_back("ProgramNameHere");
// Split my input and put the result in the rest of the vector
std::copy(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>(),
std::back_inserter(tokens));
// Now we have vector<string>, but we need array of char*. Convert to char*
std::vector<char *> ptokens;
for(auto& s : tokens)
ptokens.push_back(&s[0]);
// Now we have vector<char*>, but we need array of char*. Grab array
char **argv = &ptokens[0];
int argc = ptokens.size();
// Use argc and argv as desired. Note that they will become invalid when
// *either* of the previous vectors goes out of scope.
assert(strcmp(argv[2], "input.gmn") == 0);
assert(argc == 4);
}
このコードフラグメントは、コンパイラが次の新機能をサポートしている場合にのみコンパイルされます。
for(auto& s : tokens)
ptokens.push_back(&s[0]);
古いC++コンパイラを使用している場合は、C++2003の機能を使用してコンパイラを書き直す必要がある場合があります。
for(std::vector<string>::iterator it = tokens.begin(); it != tokens.end(); ++it)
ptokens.push_back(it->c_str());
また
for(std::vector<string>::size_type i = 0; i < tokens.size(); ++i)
ptokens.push_back(tokens[i].c_str());
boost :: program_optionsを使用して、プログラムの引数を解析することをお勧めします。
それ以外の場合、MSVCを使用している場合は、組み込みの__argcおよび__argvを使用することをお勧めします。
プログラムの画像名を取得するための移植可能な方法はありません。そのため、元のargv引数を破棄して最初に情報を削除した場合、その情報をどこからともなく取得することはできません。
C strtok関数を使用して引数を分割することができます...実際にはそれをスクラッチし、boost :: Algorithm :: splitをany_of('')と一緒に使用します。