我正在构建一个命令行工具,一开始整行是一个字符串。我怎么能转换:
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);
}
另请参阅:在 C++ 中拆分字符串?
仅当您的编译器支持以下新功能时,此代码片段才会编译:
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(' ') 一起使用即可。