C 中的 crypt 函数在 for 循环中破坏密码字符串
crypt function in C breaking password string in for loop
我是 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] = '[=10=]';
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] = '[=10=]';
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
请让我知道潜在的问题是什么,以便我可以努力解决它!提前感谢您的帮助!
我在这里猜测 cs50.h
包含一些定义,例如 a type alias from char *
to string
教授为简单起见给你的定义。
如果那是真的,那么 buildLetterDictionary()
将无法工作,因为你正在做:
char letters[27];
...
char * letter = letters;
return letter;
这意味着您返回的是局部变量的地址,该变量将在您离开函数后立即销毁。
我是 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] = '[=10=]';
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] = '[=10=]';
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
请让我知道潜在的问题是什么,以便我可以努力解决它!提前感谢您的帮助!
我在这里猜测 cs50.h
包含一些定义,例如 a type alias from char *
to string
教授为简单起见给你的定义。
如果那是真的,那么 buildLetterDictionary()
将无法工作,因为你正在做:
char letters[27];
...
char * letter = letters;
return letter;
这意味着您返回的是局部变量的地址,该变量将在您离开函数后立即销毁。