在使用C++中的强力示例程序时遇到问题

8ehkhllq  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(99)

我现在正在学习C语言,我是一个新手,很抱歉有任何简单的错误,我想做一个蛮力程序,你在控制台输入一个单词,然后C程序将随机猜测,并将它们与你输入的单词进行比较。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main() {
    unsigned long guesses;
    char guess[100];
    char pass[100];
    char letter[100];
    const char letters[26] = "abcdefghijklmnopqrstuvwxyz";
    srand(time(NULL));
    printf("\ninput your password lowercase letters only: ");
    scanf("%99s", pass);
    while (strcmp(guess, pass) != 0) {
        //reset guess
        char guess[100] = {"\0"};
        //choose a random number 
        //copy a random element from var letters
        //concentrate the letter to the guess and repeat till its as long as the password
        while (strlen(guess) < strlen(pass)) {
            char i = rand() % 26;
            strcpy(letter, &letters[i]);
            strcat(guess, letter);
        }
        printf("%s\n", guess);
        guesses++;
    }
    printf("your guess was %s and was found in %lu guesses", guess, guesses);
    return 0;
}

控制台中的输出是我输入单词yes时的输出

qrstuvwxyz�
efghijklmnopqrstuvwxyz�
efghijklmnopqrstuvwxyz�
stuvwxyz�
efghijklmnopqrstuvwxyz�
qrstuvwxyz�
bcdefghijklmnopqrstuvwxyz�
hijklmnopqrstuvwxyz�
qrstuvwxyz�
qrstuvwxyz�

我真的不知道它为什么要这样做,如果有人能帮助它,将非常感激
我尝试了许多不同的方法来添加字母的猜测,但无论我尝试它添加更多的字母,然后我需要和字母增量为1,而不是一个新的随机字符每次

kpbpu008

kpbpu0081#

测试您的代码并对其进行调整以使其正常工作,下面是代码的重构版本。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX 100

int main()
{
    unsigned long guesses = 0;
    char guess[MAX];
    char pass[MAX];
    char letter[2];
    const char letters[26] = "abcdefghijklmnopqrstuvwxyz";
    srand(time(NULL));
    printf("\nInput your password lowercase letters only: ");
    scanf("%s", pass);
    while (1)
    {
        // Reset guess
        for (int j = 0; j < MAX; j++)
        {
            guess[j] = '\0';
        }
        // Choose a random number
        // Copy a random element from var letters
        // Concentrate the letter to the guess and repeat till its as long as the password
        while (strlen(guess) < strlen(pass))
        {
            letter[0] = letters[rand() % 26];   /* Set up character string with one random character */
            letter[1] = '\0';
            strcat(guess, letter);
        }
        printf("%s\n", guess);
        guesses++;
        if (strcmp(guess, pass) == 0)
        {
            break;
        }
    }

    printf("your guess was %s and was found in %lu guesses\n", guess, guesses);

    return 0;
}

在这个经过调整的代码版本中需要注意的一些事项。

  • 当看到对固定值的重复引用时,通常习惯于使用“#define”声明来减少代码中的文字值。
  • 不是将猜测的测试作为“while”循环的真/假测试,而是建立一个简单的无限“while”循环,然后当做出正确的猜测时,从循环中中断,以消除猜测变量的模糊性和任何可能的范围问题。
  • “letter”字符串数组被简化为保存一个字符值沿着一个终止符,这简化了猜测字符串数组的连接。

下面是程序使用“bell”条目进行猜测时终端的最后几行输出。

cjih
nroe
ppzk
kyvi
cofh
bell
your guess was bell and was found in 429653 guesses

正如上面的评论所指出的,输入值越长,这种暴力破解方法花费的时间就越长。当我用五个字符的文字测试这个程序时,程序运行了很长时间,直到我手动停止程序。因此,在这个程序中,可能有一个上限测试添加到尝试的次数上。
无论如何,您可以给予这个重构的代码,看看它是否符合您的项目的精神。

相关问题