首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于教育的随机C++ STL专用密码生成器

用于教育的随机C++ STL专用密码生成器
EN

Code Review用户
提问于 2017-08-25 03:02:01
回答 1查看 259关注 0票数 4

这是我五年前写的一些代码,现在我把它部分用作教学材料。我认为有一些事情是“不存在”的,即主函数的顶部是几个变量的定义,而不是参数解析,以及实际的生成没有被分割成它自己的函数。

代码语言:javascript
复制
#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;
}
EN

回答 1

Code Review用户

发布于 2017-08-25 05:24:41

std::string类型的参数应始终作为const std::string &传递。

参数解析的代码缺少else show_usage()

usage函数通常输出一行,而help函数输出详细的用法。这是为了保持错误信息简短,这样它们才有可能被实际读取。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/173907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档