-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 中引入的两种语言特性:基于范围的 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 回答