程序功能
- 預設密碼
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)實現退格視覺回退。
- 三次鎖定機制防暴力嘗試。