这是我编写的用于验证密码的代码,但是我无法使系统验证新的密码。在该程序中,输入来自用户,并使用预定义的引脚进行验证。如果用户未能验证该密码,则会显示一个新密码,该密码将作为新密码。
#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<windows.h>
int pin();
int main()
{
int pin();
{
int pin,new_pin,old_pin;
{
old_pin=1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if(pin==old_pin)
{
printf("PIN succefully verified \n");
}
else if(pin!=old_pin)
{
printf("PIN couldn't be verified. \n");
printf("Press 1 to generate a new pin, 2 to re-enter or 0 to exit\n");
scanf("%d", &new_pin);
if (new_pin==1)
{
printf("Your new pin is: \n");
//generating random 4numbered pin
int i,random;
for(i=0; i<3; i++)
random= (rand() );
printf("%d\n", random);
main();
random=new_pin;
new_pin=old_pin;
}
else if (new_pin==2) {
main();
}
else{
printf("Exiting the program....\n");
exit;
}
}
}
}
return(0);
}
答案 0 :(得分:0)
首先,需要重新访问代码。您引用了名为pin()
的函数,该函数是我们所不知道的。接下来,我们遇到了很小的名称冲突(int pin;
,int pin();
)。有太多的代码块。变量命名不当(new_pin
不是新引脚,old_pin
不是旧引脚)。当您覆盖变量而不存储旧随机数时,用于生成引脚的循环是无用的。禁止\
(和其他)中没有printf
的多行字符串(我在您的原始代码附近发现了它们)。 exit
缺少括号。这与语法,代码优化和命名质量有关。
代码递归地调用main,这当然不是一个好主意(除非您知道您在做什么!)
我已经格式化它并删除了int pin();
声明,因为它们是多余的。减少了代码块的复杂性,并消除了不必要的库导入。 for循环得到了简化(因为它是多余的)。代码现在看起来像这样:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int pin, new_pin, old_pin = 1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if (pin == old_pin)
printf("PIN succefully verified.\n");
else if (pin != old_pin) {
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to re-enter or 0 to exit\n");
new_pin = getchar();
if (new_pin == '1') {
int i, random;
printf("Your new pin is: %4d\n" rand() % 9999);
main();
} else if (new_pin=='2')
main();
else {
printf("Exiting the program....\n");
return 0;
}
}
}
现在,让我们实施一下功能错误的实现。新的销钉机制被如此严重地破坏,没有任何解释的意义。最好换个新的。值是静态的,因此在创建新的局部变量集后它们不会消失。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
static int pin, new_pin, validPin = 1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if (pin == validPin)
printf("PIN succefully verified.\n");
else if (pin != validPin) {
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to fall back or any other key to exit.\n");
new_pin = getchar();
if (new_pin == '1') {
validPin = rand() % 9999;
printf("Your new pin is: %4d.\n", validPin);
main();
} else if (new_pin=='2')
main();
else {
printf("Exiting the program.\n");
return 0;
}
}
}
现在,让我们重新看一下主递归反模式,并将代码划分为子过程。
#include <stdio.h>
#include <stdlib.h>
int proc() {
/* ... the code in partially unmodified form goes here. */
}
int main(void) {
while(!proc());
}
最后,让我们弄乱变量范围,将其减小到绝对最小值,然后将退出消息放在main的末尾。最后的代码如下:
#include <stdio.h>
#include <stdlib.h>
int proc() {
int pin;
static int validPin = 1111;
printf("Enter your pin: ");
scanf("%d", &pin);
if (pin == validPin)
printf("PIN succefully verified.\n");
else if (pin != validPin) {
int command;
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to fall back or any other key to exit.\n");
command = getchar();
if (command == '1') {
validPin = rand() % 9999;
printf("Your new pin is: %4d.\n", validPin);
return 0;
} else if (command == '2')
return 0;
else
return 1;
}
return 1;
}
int main(void) {
while(!proc());
printf("Exiting the program.\n");
}
由于某些在线C编译器可能会对getchar()
做出错误反应,因此请像您实际那样使用scanf()
:
int command;
printf("PIN couldn't be verified.\n");
printf("Press 1 to generate a new pin, 2 to fall back or 0 to exit:\n");
scanf("%d", &command);
if (command == 1) {
validPin = rand() % 9999;
printf("Your new pin is: %4d.\n", validPin);
return 0;
} else if (command == 0)
return 1;
else
return 0;
可以通过将上帝程序proc()
扩展到pin验证程序和命令处理程序中来改进我的最终代码,但是该应用程序非常简单,可以使事情变得简洁。在您的学习曲线中,此应用示例可能是一段不错的代码,可以训练重构技能。
希望我的评论对您有所帮助。