Forslagene til boost::program_options
og GNU getopt er gode.
Men for enkle kommandolinjevalg jeg pleier å bruke std :: finne
For eksempel å lese navnet på en fil etter en -f
kommandolinje argument. Du kan også bare oppdage om et enkelt ord alternativ har gått inn som -h
for å få hjelp.
#include <algorithm>
char* getCmdOption(char ** begin, char ** end, const std::string & option)
{
char ** itr = std::find(begin, end, option);
if (itr != end && ++itr != end)
{
return *itr;
}
return 0;
}
bool cmdOptionExists(char** begin, char** end, const std::string& option)
{
return std::find(begin, end, option) != end;
}
int main(int argc, char * argv[])
{
if(cmdOptionExists(argv, argv+argc, "-h"))
{
// Do stuff
}
char * filename = getCmdOption(argv, argv + argc, "-f");
if (filename)
{
// Do interesting things
// ...
}
return 0;
}
På ting å se opp for med denne tilnærmingen må du bruke std :: strenger som verdien for std :: finne ellers likestilling kontrollen utføres på pekeren verdier.
Jeg håper det er greit å redigere dette svaret i stedet legge til en ny en, da dette er basert på den opprinnelige svaret. Jeg re-skrev funksjonene litt og innkapslet dem i en klasse, så her er koden. Jeg tenkte at det kunne være praktisk å bruke det på den måten også:
class InputParser{
public:
InputParser (int &argc, char **argv){
for (int i=1; i < argc; ++i)
this->tokens.push_back(std::string(argv[i]));
}
/// @author iain
const std::string& getCmdOption(const std::string &option) const{
std::vector<std::string>::const_iterator itr;
itr = std::find(this->tokens.begin(), this->tokens.end(), option);
if (itr != this->tokens.end() && ++itr != this->tokens.end()){
return *itr;
}
static const std::string empty_string("");
return empty_string;
}
/// @author iain
bool cmdOptionExists(const std::string &option) const{
return std::find(this->tokens.begin(), this->tokens.end(), option)
!= this->tokens.end();
}
private:
std::vector <std::string> tokens;
};
int main(int argc, char **argv){
InputParser input(argc, argv);
if(input.cmdOptionExists("-h")){
// Do stuff
}
const std::string &filename = input.getCmdOption("-f");
if (!filename.empty()){
// Do interesting things ...
}
return 0;
}