Функция печати всех комбинаций введенных символов не распечатывается должным образом - PullRequest
0 голосов
/ 09 апреля 2020

Цель моей программы - напечатать все комбинации символов, которые пользователь может ввести, если он не превышает максимальную длину. Я могу правильно заполнить массив символами, показать количество введенных символов и максимальную длину строки (введенной пользователем). Однако функции не печатаются должным образом. Теоретически, если пользователь ввел 2 символа (a, b) с максимальной длиной 2 , программа должна вывести это ...

a
b
aa
ab
ba
bb

Вместо этого мой код выводит это и я не могу понять, почему ...

a
ab

Ниже приведены две мои функции. Моя основная функция получает пользовательский ввод для количества символов, массива символов и максимальной длины выводимой строки. После этого он вызывает функцию generatePassword . Буду признателен за любую помощь!

int crack(char *characters[], int i, char s[], int numCharacters, int passwordLength) {
    if (i==0) {
        printf("%s\n", s);
        return 0;
    }
    for (int j = 0; j < numCharacters; j++) {
        char string[MAX];
        strcpy(string, strcat(s, characters[j]));
        crack(characters, i-1, string, numCharacters, passwordLength);
    }
    return 0;
}


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

    for (int i = 1; i < passwordLength; i++) {
        char s[MAX] = "";
        int num = crack(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+2]) > 1) {
                        printf("ERROR: You can only input one character at a time.\n");
                        return -1;
                }
        }

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

        char *charArray[numCharacters];

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

        generatePassword(charArray, numCharacters, passwordLength);
        return 0;
}

РЕДАКТИРОВАТЬ: я добавил свою основную функцию в код, чтобы показать, как я вызываю generatePassword. Цель кода - получить количество символов, которые нужно ввести, количество символов и максимальную длину строки из командной строки в среде linux.

1 Ответ

1 голос
/ 09 апреля 2020
void generatePassword(char* characters[], int numCharacters, int passwordLength) {

    for (int i = 1; i < passwordLength; i++) {

Ваша проблема прямо здесь. Если passwordLength равно двум, вам нужно добавить два символа. Но этот l oop будет выполняться только один раз, если passwordLength равно двум. Вы хотите:

for (int i = 1; i <= passwordLength; i++) {

Вывод теперь:

a
b
aa
ab
ba
bb

Есть несколько других ошибок, таких как неправильное использование strcat и некоторые отдельные ошибки с индексами аргументов. Вы можете видеть, что это работает со всеми исправленными ошибками здесь .

...