使用 c 编程语言尝试 3 次密码屏蔽

password masking with 3 attempts using c programming language

我是学习 C 编程语言的初学者。我的问题一直存在一些问题,即,我的 ATM 银行系统尝试了 3 次密码屏蔽。此外,我使用了 goto 语句,但是,我们仅限于使用此语句。那么如何删除 goto 语句并改用循环呢?急需帮助。谢谢!代码在下面。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

#define ENTER 13
#define TAB 9
#define BCKSPC 8


int pinValidation()
{
    char pwd[20], pin[]="5263";
    int attemptCount=1;
    char ch;
    start:
    int i=0;

        //attempts count
    do{
        printf("Enter your pin: ");
        while(1)
            {
                ch=getch();
                if(ch == ENTER || ch == TAB)
                {
                    pwd[i]='[=10=]';
                    break;
                }
                else if(ch == BCKSPC)
                {
                    if(i>0)
                    {
                        i--;
                        printf("\b \b"); //for the cursor
                    }
                }
                else if(pwd[i]=ch)
                {
                    pwd[i]=ch;
                    i++;
                    printf("*");
                }
            }
    }while(ch != ENTER);

        if(strcmp(pin,pwd)==0 && attemptCount <= 4)
            {
                Beep(1000,500);
                Beep(1000,600);
                printf("\nAccess granted");
                
            }
        
        else
        {
            Beep(750, 800);
             printf("\n\nUnsuccessful login %d of 3 attempt\n\n", attemptCount);
             attemptCount++;
            if (attemptCount < 4) goto start;
            if (attemptCount == 4) {
                goto reached;
            }
            getch();
            reached:
            Beep(800,800);
            Beep(800,800);
            Beep(800,900);
            printf("Attempt reached");
             
        }
        getch();
            
}
        

int main()
{
    pinValidation();
    return 0;
}

/*

    start
    initialize variables
    input pin
    if pin is != inputed pin && attempt < 3
        print unsuccessful login %d attempt left
    else if pin != inputed pin && attempt += 3
        print "attempt reached"
    else if pin == inputted pin && attempt <= 3
        print "Access granted"

*/

这看起来有点理所当然?! ;-)

尽管如此,希望这有助于您理解该方法...

#include <stdio.h>
#include <stdbool.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

#define ENTER 13
#define TAB 9
#define BCKSPC 8

#define MAXATTEMPTS 4
#define MAXPINLENGTH 4

void getPin(char* pinCapture, size_t size)
{
    char ch;
    int pinLength = 0;
    pinCapture[pinLength] = '[=10=]';

    printf("Enter PIN? ");
    do
    {
        ch = getch();
        switch (ch)
        {
            // Characters to ignore...
            case ENTER:
            case TAB:
                break;
            // Allow user to delete previous digits
            case BCKSPC:
                if (pinLength > 0)
                {
                    pinLength--;
                    printf("\b \b");
                }
                break;
            // Add character to PIN...
            default:
                pinCapture[pinLength] = ch;
                pinLength++;
                printf("*");
                break;
        }
    } while (ch != ENTER && pinLength < size);
    pinCapture[pinLength] = '[=10=]';
    printf("\n");
}

bool pinValidation()
{
    char validPin[] = "1234";
    int attemptCount = 0;
    char pin[5];

    while (attemptCount < MAXATTEMPTS && strcmp(pin, validPin) != 0)
    {
        attemptCount++;
        getPin(pin, MAXPINLENGTH +1);
        if (strcmp(pin, validPin) != 0)
        {
            printf("Invalid attempt. You have %d more trys.\n", MAXATTEMPTS - attemptCount);
        }
    }
    if (strcmp(pin, validPin) == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    if (pinValidation())
    {
        printf("Access granted.\n");
    }
    else
    {
        printf("Access denied.\n");
    }
    return 0;
}

/*
    start
    initialize variables
    input pin
    if pin is != inputed pin && attempt < 3
        print unsuccessful login %d attempt left
    else if pin != inputed pin && attempt += 3
        print "attempt reached"
    else if pin == inputted pin && attempt <= 3
        print "Access granted"
*/

您不需要使用循环来代替 'goto' 语句。您只需将 'do while' 和 'while' 循环更改为 'for' 循环。 我有一个代码示例给你。

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define ENTER 13
#define BACKSPC 8

int pinvalidation()
{
    char pwd[20], pin[5] = "6244";
    char ch;
    int attempt = 0, i = 0;
    printf("You have only 3 attempted\n");
start:
    // Take password as input
    printf("Enter your pin:  ");
    for (int i = 0; 1; i++)
    {
        ch = getch();
        if (ch == ENTER)
        {
            pwd[i] = '[=10=]';
            break;
        }
        else if (ch == BACKSPC)
        {
            if (i > 0)
            {
                i--;
                printf("\b \b");
            }
        }
        else
        {
            pwd[i] = ch;
            printf("*");
        }
    }
    attempt++;
    // check it is correct or not
    if (strcmp(pwd, pin) == 0 && attempt <= 3)
    {
        Beep(1000, 200);
        printf("\nAccess Granted\n");
        return 1;
    }
    else
    {
        Beep(700, 800);
        printf("\n\t\t Wrong Password \n%d attempt left\n", 3 - attempt);
        if (attempt < 3)
            goto start;
        else
        printf("Access Denited");
            return 0;
    }
}
int main()
{
    pinvalidation();
    return 0;
}