Как я могу создать список всех возможных комбинаций паролей с argv? - PullRequest
0 голосов
/ 06 апреля 2020

Я новичок, поэтому, если я пропущу что-то жизненно важное для кода, пожалуйста, прости меня, ха-ха. Я делаю программу, которая получает данные из консоли, которые говорят, сколько символов будет использоваться, символы (отдельные буквы), а затем, как долго вы хотите, чтобы пароль был. Я чувствую, что я довольно близко, но каждый раз, когда я запускаю программу, кажется, что она генерирует случайный набор букв, и я не могу следовать за ним.

Вот мой код, включая основную функцию.

#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 ab 2", результат должен быть

a
b
aa
ab
ba
bb

Это мой текущий вывод. Как я могу сделать так, чтобы это выглядело так, как показано выше?

a
ab
abaa
abaab
abaabba
abaabbab

1 Ответ

1 голос
/ 06 апреля 2020

Вам необходимо изучить основы массивов и строк.

Представьте, что я запускаю ваш код как app.exe 99

Это неопределенное поведение:

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

Если argv[1], скажем, "99", тогда numCharacters будет 99.

Тогда passwordLength будет присвоено преобразование atoi argv[101]. Но в argv есть только два допустимых элемента: argv[0], который является путем к исполняемому файлу, и argv[1], который является "99". argv[2] и выше - это случайная память, на которую вы не можете смотреть.

Это также неправильно:

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

Вы выделяете массив (строковых) указателей, а затем присваиваете индекс один за допустимым диапазоном массива.

...