首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

用棧實現密碼驗證系統:支持退格、限制嘗試次數、棧逆序比對邏輯

     編輯:C 語言基礎

程序功能

  • 預設密碼 abcdef(長度 6)。
  • 用戶輸入密碼,支持退格(Backspace,ASCII 8)刪除。
  • 輸入過程顯示 * 掩碼。
  • 最多 3 次嘗試,失敗退出。
  • 驗證時將棧內字符逆序彈出與明文密碼逐字符比對。

棧結構定義

#define STACK_INIT_SIZE 10
#define OK 1; #define TRUE 1; #define FALSE 0; #define ERROR 0

typedef char SElemType;
typedef struct STACK {
    SElemType *base, *top;
    int stacksize, length;
} SqStack, *Stack;
typedef int Status;

核心操作實現

  • InitStack:分配棧結構體與數據區,top=base,length=0。
  • Push:滿則 realloc 擴容(+2),存入字符,top++,length++。
  • Pop:空則報錯,否則 top--,length--。
  • GetTop:取棧頂元素並彈出(top--),用於逆序導出。
  • Change:循環 GetTop 將棧中元素逆序存入數組 a[]。

主控制邏輯

void Control(Stack *s) {
    int i=0, k=strlen(PASSWORD), j=0;
    SElemType ch, *a;
    while (1) {
        if (i >= 3) { clrscr(); break; }  // 3次失敗
        if (i > 0) { gotoxy(5,2); ClearStack(s); }  // 重試清屏重輸
        // 密碼輸入循環
        while (1) {
            ch = getch();
            if (ch != 13) {  // 非回車
                if (ch == 8) { Pop(s); putchar(' '); }  // 退格
                else { putchar('*'); Push(s, ch); }
                j = s->length;
            } else break;
        }
        i++;
        if (k != s->length) continue;  // 長度不匹配直接重試
        a = (SElemType*)malloc(s->length * sizeof(SElemType));
        Change(*s, a);  // 逆序導出
        for (j=1; j<=s->length; )
            if (a[j-1] == PASSWORD[j-1]) j++;
            else { j = s->length+2; break; }
        if (j == s->length+2) continue;  // 內容不匹配重試
        else break;  // 成功
    }
    if (i==4) printf("\n密碼錯誤,即將退出");
    else printf("\n密碼正確\n");
    free(a);
}

工程亮點

  • 棧完美契合「後進先出」逆序比對需求。
  • 動態擴容應對理論長度不定輸入。
  • 控制台光標控制(gotoxy)實現退格視覺回退。
  • 三次鎖定機制防暴力嘗試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved