这是我五年前写的一些代码,现在我把它部分用作教学材料。我认为有一些事情是“不存在”的,即主函数的顶部是几个变量的定义,而不是参数解析,以及实际的生成没有被分割成它自己的函数。
#include <chrono>
#include <functional>
#include <iostream>
#include <random>
#include <string>
static void show_usage(std::string name)
{
std::cerr << "Usage: " << name << " <option(s)>\n"
<< "Options:\n"
<< "\t-h,--help\t\tShow this help message\n"
<< "\t-l,--length LENGTH\tSpecify the password length\n"
<< "\t-s,--seed SEED\t\tUse a unique seed for the random engine\n"
<< "\t-v,--version\t\tOutput the program version\n";
}
int main (int argc, char *argv[])
{
std::string charset ("abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"1234567890!@#$%^&*()");
int length = 16;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution (0, (int) charset.size() - 1);
generator.seed (std::chrono::system_clock::now().time_since_epoch().count());
if (argc >= 2) {
for (int i = 1; i < argc; i++) {
std::string arg = argv[i];
if ((arg == "-l") || (arg == "--length")) {
if (i + 1 < argc) {
length = atoi(argv[++i]);
} else {
std::cerr << "-l,--length takes one argument" << std::endl;
return 1;
}
} else if ((arg == "-s") || (arg == "--seed")) {
if (i + 1 < argc) {
std::string str (argv[++i]);
std::seed_seq seed (str.begin(), str.end());
generator.seed (seed);
} else {
std::cerr << "-s,--seed takes one argument" << std::endl;
return 1;
}
} else if ((arg == "-h") || (arg == "--help")) {
show_usage(argv[0]);
return 0;
} else if ((arg == "-v") || (arg == "--version")) {
std::cout << "Version 0.0.1" << std::endl;
return 0;
}
}
}
auto randchar = std::bind (distribution, generator);
std::string password;
password.resize(length);
for (int i = 0; i < length; i++) {
password.at(i) = charset.at(randchar());
}
std::cout << password << std::endl;
return 0;
}发布于 2017-08-25 05:24:41
std::string类型的参数应始终作为const std::string &传递。
参数解析的代码缺少else show_usage()。
usage函数通常输出一行,而help函数输出详细的用法。这是为了保持错误信息简短,这样它们才有可能被实际读取。
https://codereview.stackexchange.com/questions/173907
复制相似问题