C中的crypt函数在for循环中中断密码字符串
我是C语言的新手,我一直在学习CS50课程来学习一些基础知识。我一直在尝试解决这个挑战,它要求您制作一个简单的密码破解程序,但我遇到了一个问题,这使我无法编写函数程序:每次我在for循环中调用crypt函数时,它都会以某种方式打断我正在迭代的密码字符串 我试着复制密码字符串,并将其作为参数传递给crypt;我还尝试将crypt调用移动到一个单独的函数中,并从循环中调用该函数(以及两者的组合) 代码按预期工作,并生成输出:C中的crypt函数在for循环中中断密码字符串,c,loops,cs50,crypt,C,Loops,Cs50,Crypt,我是C语言的新手,我一直在学习CS50课程来学习一些基础知识。我一直在尝试解决这个挑战,它要求您制作一个简单的密码破解程序,但我遇到了一个问题,这使我无法编写函数程序:每次我在for循环中调用crypt函数时,它都会以某种方式打断我正在迭代的密码字符串 我试着复制密码字符串,并将其作为参数传递给crypt;我还尝试将crypt调用移动到一个单独的函数中,并从循环中调用该函数(以及两者的组合) 代码按预期工作,并生成输出: A B C D E 但是如果我保留这些行,第一次将密码打印为带有散列“5
A
B
C
D
E
但是如果我保留这些行,第一次将密码打印为带有散列“50pe4e2XTIS/g”的“A”,但随后每次都会打印为带有散列“50sXZPq5euCxs”的“A”
请让我知道潜在的问题是什么,以便我可以努力解决它!提前谢谢你的帮助 我猜这里的
cs50.h
包含一些定义,就像教授为了简单起见给你的定义一样
如果这是真的,则buildLetterDictionary()
无法工作,因为您正在执行以下操作:
char letters[27];
...
char * letter = letters;
return letter;
这意味着您正在返回一个局部变量的地址,该地址将在您离开函数时被销毁。请记住,
argc
是argv
中的有效元素数。这包括argv[0]
,这意味着argc==2
是一个参数。不是使用传递的参数。至于您的问题,您在buildLetterDictionary
中所做的是返回一个指向局部变量的指针。一种局部变量,其生存期在函数返回时结束,使返回的指针立即无效。
头使查看发生了什么变得更加困难。。。i、 e.返回一个最简单的修复方法是将数组声明为静态字符[27]代码>@AnttiHaapala:同意。我认为cs50的作者做了一个糟糕的决定,做了typedef char*string代码>。嘿,谢谢你的回答,这似乎就是问题所在!另外,@Antti Haapala提出了一个解决方案,似乎可以解决这个问题:将字符[27]作为静态声明。@user11073489不客气!是的,这是一个解决方案,但也有缺点。我不想谈细节;当你开始学习越来越多的知识时,你会发现有些模式会适得其反,而且有更好的方法来实现同样的目标:)
A
B
C
D
E
char letters[27];
...
char * letter = letters;
return letter;