【问题标题】:How can I generate a list of all possible password combinations with argv?如何使用 argv 生成所有可能的密码组合列表?
【发布时间】:2020-07-17 23:56:04
【问题描述】:

我是初学者,所以如果我错过了对代码至关重要的内容,请原谅我哈哈。我正在制作一个程序,它从控制台获取输入,说明将使用多少个字符、字符(单个字母),以及您希望密码的长度。我觉得我已经很接近了,但是每次我运行程序时,它似乎都会生成一个随机的字母模式,我无法遵循它。

这是我的代码,包括主要功能。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100


int generatePassword(char* characters[], int i, char s[], int numCharacters, int passwordLength) {

        if (i==0) {
                printf("%s\n", s);
                return 0;
        }

        for (int j = 0; j < passwordLength; j++) {
                strcat(s, characters[j]);
                generatePassword(characters, i-1, s, numCharacters, passwordLength);
        }

        return 0;

}


void homeFunction(char* characters[], int numCharacters, int passwordLength) {
        for (int i = 1; i <= numCharacters; i++) {
                char s[MAX] = "";
                int c = generatePassword(characters, i, s, numCharacters, passwordLength);
        }
}


int main (int argc, char *argv[]) {

        if (argc < 2) {
                printf("ERROR: Program did not execute due to lack of arguments.\n");
                return -1;
        }

        int numCharacters;
        numCharacters = atoi(argv[1]);
        int passwordLength;
        passwordLength = atoi(argv[numCharacters+2]);

        for (int i = 0; i < numCharacters; i++) {
                if (strlen(argv[i+1]) > 1) {
                        printf("ERROR: You can only input one character at a time.\n");
                        return -1;
                }
        }

        if (argv != numCharacters + 3) {
                 printf("ERROR: Invalid number of arguments.\n");
                 return -1;
        }

        char *charArray[numCharacters];
        charArray[numCharacters] = (char*)malloc(numCharacters * sizeof(char));

        for (int i = 0; i < numCharacters; i++) {
                charArray[i] = argv[i+2];
        }

        homeFunction(charArray, numCharacters, passwordLength);

        return 0;

}

理论上,如果用户使用“./NAME 2 a b 2”运行程序,结果应该是

a
b
aa
ab
ba
bb

这是我当前的输出。我怎样才能让它看起来像上面的输出?

a
ab
abaa
abaab
abaabba
abaabbab

【问题讨论】:

    标签: c loops recursion argv


    【解决方案1】:

    您需要学习数组和字符串的基础知识。

    想象一下,如果我以app.exe 99 运行您的代码

    这是未定义的行为:

        numCharacters = atoi(argv[1]);
        int passwordLength;
        passwordLength = atoi(argv[numCharacters+2]);
    

    如果argv[1]"99",那么numCharacters 将是99

    那么passwordLength会被分配argv[101]的atoi转换。但是argv 中只有两个有效元素:argv[0] 是可执行路径,argv[1]"99"argv[2] 及以上是不属于你的随机内存。

    这也是错误的:

        char *charArray[numCharacters];
        charArray[numCharacters] = (char*)malloc(MAX * sizeof(char));
    

    您正在分配一个(字符串)指针数组,然后分配给一个超出数组有效范围的索引。

    【讨论】:

    • 在我的课堂上,教授正在运行代码,其中 argv[1] 是允许在命令行上输入的字符数,命令中的最后一个 arg[v] 是长度的密码。你会如何建议我更改我的代码?谢谢
    • 如果有帮助的话,我们正在使用 mobaxterm 和 linux 服务器来编写和运行代码。
    • 您需要验证argc is &gt;= (3 + numCharacters)
    • 不幸的是,这仍然没有给我我想要达到的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多