我的PAT系列文章更新重心已移至Github屡谐,歡迎來看PAT題解的小伙伴請到Github Pages瀏覽最新內(nèi)容瞒津。此處文章目前已更新至與Github Pages同步爹脾。歡迎star我的repo毫深。
題目
當你試圖登錄某個系統(tǒng)卻忘了密碼時,系統(tǒng)一般只會允許你嘗試有限多次控轿,當超出允許次數(shù)時,賬號就會被鎖死。本題就請你實現(xiàn)這個小功能茬射。
輸入格式:
輸入在第一行給出一個密碼(長度不超過 20 的鹦蠕、不包含空格、Tab在抛、回車的非空字符串)和一個正整數(shù) N(
10)片部,分別是正確的密碼和系統(tǒng)允許嘗試的次數(shù)。隨后每行給出一個以回車結(jié)束的非空字符串霜定,是用戶嘗試輸入的密碼档悠。輸入保證至少有一次嘗試。當讀到一行只有單個 #
字符時望浩,輸入結(jié)束辖所,并且這一行不是用戶的輸入。
輸出格式:
對用戶的每個輸入磨德,如果是正確的密碼且嘗試次數(shù)不超過 N缘回,則在一行中輸出 Welcome in
,并結(jié)束程序典挑;如果是錯誤的酥宴,則在一行中按格式輸出
Wrong password: 用戶輸入的錯誤密碼
;當錯誤嘗試達到 N 次時您觉,再輸出一行 Account locked
拙寡,并結(jié)束程序。
輸入樣例 1:
Correct%pw 3
correct%pw
Correct@PW
whatisthepassword!
Correct%pw
#
輸出樣例 1:
Wrong password: correct%pw
Wrong password: Correct@PW
Wrong password: whatisthepassword!
Account locked
輸入樣例 2:
cool@gplt 3
coolman@gplt
coollady@gplt
cool@gplt
try again
#
輸出樣例 2:
Wrong password: coolman@gplt
Wrong password: coollady@gplt
Welcome in
思路
很考察思路嚴謹?shù)囊坏李}琳水,真的要考慮周全輸入密碼時的情況肆糕。
正確密碼是沒有任何空白字符的,而用戶輸入可以在一行內(nèi)任意輸入在孝,因此接受用戶輸入應該以換行符為判斷標準诚啃。
C不方便的地方就是讀字符串必須提前設定長度,而這道題的用戶輸入并沒有任何限制私沮,因此在程序中應該考慮防溢出的機制(比如邊界檢查):
- 我每次只讀20個字符或者讀到換行始赎,達到這樣的目的,使用了
scanf("%20[^\n]")
仔燕,[^...]
能夠讀取到^后邊的字符造垛,而不是%s
讀到空白字符。 - 如果用戶還有輸入涨享,再逐一讀取字符筋搏,一直輸出到換行,這樣保證了程序的健壯性厕隧。
代碼
最新代碼@github奔脐,歡迎交流
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main()
{
int N;
char c, correct[21], user[21];
scanf("%s %d", correct, &N);
while(getchar() != '\n');
while(N--)
{
scanf("%20[^\n]", user); /* avoid overflow */
c = ungetc(getchar(), stdin);
if(!strcmp(user, "#") && c == '\n')
{
break;
}
else if(!strcmp(correct, user) && c == '\n')
{
puts("Welcome in");
break;
}
else
{
printf("Wrong password: %s", user);
while(putchar(getchar()) != '\n') ;
if(!N) puts("Account locked");
}
}
return 0;
}