该程序似乎没有更新值并验证新值

时间:2019-03-20 14:36:01

标签: c

这是我编写的用于验证密码的代码,但是我无法使系统验证新的密码。在该程序中,输入来自用户,并使用预定义的引脚进行验证。如果用户未能验证该密码,则会显示一个新密码,该密码将作为新密码。

#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);
}

1 个答案:

答案 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验证程序和命令处理程序中来改进我的最终代码,但是该应用程序非常简单,可以使事情变得简洁。在您的学习曲线中,此应用示例可能是一段不错的代码,可以训练重构技能。

希望我的评论对您有所帮助。