C中的crypt函数在for循环中破解密码字符串

问题描述 投票:0回答:1

我是C的新手,我一直在学习CS50课程,学习一些基础知识。我一直在努力解决需要你制作一个简单的密码破解者的挑战,但我遇到了一个问题,导致我无法编写函数程序:每次我在for循环中调用crypt函数时,它都会破坏我的密码我正在迭代的字符串。

我已经尝试制作密码字符串的副本,并将其作为参数传递给crypt;我也尝试将crypt调用移动到一个单独的函数中并从循环中调用它(以及两者的组合)

#define _XOPEN_SOURCE
#include <unistd.h>
#include <cs50.h>
#include <stdio.h>
#include <string.h>

string buildLetterDictionary();

int main(int argc, string argv[])
{
    if (argc == 2)
   {
        printf("Two arguments, starting test...\n");

        char password[2];
        string letters = buildLetterDictionary();
        for(int i = 0; i < 5; i++)
        {
            password[0] = letters[i];
            password[1] = '\0';
            printf("Password: %s\n", password);
            string hashed = crypt(password, "50");
            printf("\n%i\nOriginal: %s\nHashed: %s\n", i, password, hashed);
        }
        return 0;
    }
    else
    {
        printf("Usage: ./crack hash");
        return 1;
    }
}

string buildLetterDictionary()
{
    char letters[27];
    for(int i = 65; i < 91; i++)
    {
        letters[i-65] = i;
    }
    letters[26] = '\0';
    string letter = letters;
    return letter;
}

如果我注释掉这些线条:

string hashed = crypt(password, "50");
printf("\n%i\nOriginal: %s\nHashed: %s\n", i, password, hashed);

代码按预期工作,并生成输出:

A
B
C
D
E

但是,如果我将这些行留下来,密码将首次打印为“A”,散列为“50pe4e2XTIS / g”,但随后的每个时间都打印为“”,散列为“50sXZPq5euCxs”

请让我知道潜在的问题是什么,以便我可以努力解决它!在此先感谢您的帮助!

c loops cs50 crypt
1个回答
1
投票

我在这里猜测cs50.h包含一些像a type alias from char * to string这样的定义,教授为了简单起见而给你。

如果这是真的,那么buildLetterDictionary()无法工作,因为你正在做:

char letters[27];
...
char * letter = letters;
return letter;

这意味着您将返回局部变量的地址,该变量将在您离开函数后立即销毁。

© www.soinside.com 2019 - 2024. All rights reserved.