Я изучаю C с задачей курса CS50, установленной 2, используя функцию crypt для грубого угадывания пароля. В настоящее время пишется функция, которая печатает все возможные строки определенной длины, например:
aa
ab
...
az
ba
...
zy
zz
Я написал довольно простую рекурсивную функцию для этого:
#include <cs50.h>
#include <stdio.h>
#include <crypt.h>
#include <string.h>
void stringcycler(int n, int passLength, char *pass)
// Scrolls through all lowercase letter combinations for a string of length passLength
// Expects an integer value of the length of the strng as both n and passLength
// Also expects a char* array of length passLength with all chars set to 'a' (and a null character)
{
if(n != 0)
{
for(pass[passLength - n] = 'a'; pass[passLength - n] < 'z'; pass[passLength - n]++)
{
stringcycler(n-1, passLength, pass);
printf("%s\n", pass);
// return 0;
}
}
}
int main()
{
// Initialise char *c, and scroll through letters
int passLength = 2; // The number of characters you want to brute force guess
char pass[passLength + 1]; // Add 1 for the null character
int i;
for(i = 0; i < passLength; i++) pass[i] = 'a'; // Set every char in pass to 'a'
pass[passLength] = '\0'; // Set null character at the end of string
stringcycler(passLength, passLength, pass);
return 0;
}
Это работает по большей части, но идет только к yz. Всякий раз, когда он видит z, он в основном пропускает, поэтому он переходит к yz, затем никогда не делает za к zz. Если я добавлю = к строке цикла:
pass[passLength - n] < 'z';
т.
pass[passLength - n] <= 'z';
Затем он печатает символы «{» в миксе. Любая помощь? И еще один вопрос: как я могу изменить это, чтобы работать для всех комбинаций верхнего и нижнего регистра, есть ли аккуратный способ сделать это?