Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的crypt函数在for循环中中断密码字符串_C_Loops_Cs50_Crypt - Fatal编程技术网

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

C中的crypt函数在for循环中中断密码字符串,c,loops,cs50,crypt,C,Loops,Cs50,Crypt,我是C语言的新手,我一直在学习CS50课程来学习一些基础知识。我一直在尝试解决这个挑战,它要求您制作一个简单的密码破解程序,但我遇到了一个问题,这使我无法编写函数程序:每次我在for循环中调用crypt函数时,它都会以某种方式打断我正在迭代的密码字符串 我试着复制密码字符串,并将其作为参数传递给crypt;我还尝试将crypt调用移动到一个单独的函数中,并从循环中调用该函数(以及两者的组合) 代码按预期工作,并生成输出: A B C D E 但是如果我保留这些行,第一次将密码打印为带有散列“5

我是C语言的新手,我一直在学习CS50课程来学习一些基础知识。我一直在尝试解决这个挑战,它要求您制作一个简单的密码破解程序,但我遇到了一个问题,这使我无法编写函数程序:每次我在for循环中调用crypt函数时,它都会以某种方式打断我正在迭代的密码字符串

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

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

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;