-1

私はコマンドラインツールを構築していますが、最初は行全体が文字列です。どうすれば変換できますか:

  string text = "-f input.gmn -output.jpg";

の中へ

  const char *argv[] = { "ProgramNameHere", "-f", "input.gmn", "-output.jpg" };
4

2 に答える 2

3

を使用する必要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);

}

参照:C ++で文字列を分割しますか?


追記:私が提供したソリューションでは、C++2011で導入された2つの言語機能を使用しました。範囲ベースのforループ型推論です。

このコードフラグメントは、コンパイラが次の新機能をサポートしている場合にのみコンパイルされます。

    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());
于 2012-05-08T20:41:08.053 に答える
1

boost :: program_optionsを使用して、プログラムの引数を解析することをお勧めします。

それ以外の場合、MSVCを使用している場合は、組み込みの__argcおよび__argvを使用することをお勧めします。

プログラムの画像名を取得するための移植可能な方法はありません。そのため、元のargv引数を破棄して最初に情報を削除した場合、その情報をどこからともなく取得することはできません。

C strtok関数を使用して引数を分割することができます...実際にはそれをスクラッチし、boost :: Algorithm :: splitをany_of('')と一緒に使用します。

于 2012-05-08T20:26:01.097 に答える