试密码
题目描述
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。
输入格式
输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。
输出格式
对用户的每个输入,如果是正确的密码且尝试次数不超过 N,则在一行中输出 Welcome in
,并结束程序;如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码
;当错误尝试达到 N 次时,再输出一行 Account locked
,并结束程序。
输入样例1
1 | Correct%pw 3 |
输出样例1
1 | Wrong password: correct%pw |
输入样例2
1 | cool@gplt 3 |
输出样例2
1 | Wrong password: coolman@gplt |
问题解决
解题思想
此题也是简单的逻辑题,但是要特别注意以下几点:
- 正确的密码是不含空格的,但是错误的输入可能会含空格(输入样例2可见)。因此读入输入密码时需用
getline()
,不能用cin
,但getline()
会读入空换行,因此需要用getchar()
吸收。 - 注意遇到
#
号时要跳出循环。坑点提醒
请大家观察代码1与代码2的差异,这一坑点可能比较难发现。代码1在没有遇到正确的输入密码(也没有遇到#
)之前会读入N + 1
次,第N + 1
次时不判断密码是否正确,直接输出Account locked
(因超过允许次数),然后跳出循环,这样的话面对某些特殊输入时会产生错误;而代码2在没有遇到正确的输入密码(也没有遇到#
)之前会读入N
次,第N
次时判断密码是否正确并进行相应输出后再判断是否达到允许次数,达到就输出Account locked
,并跳出循环。
代码示例(C/C++)
代码1(测试点4错误)
1 |
|
代码2(AC)
1 |
|
题目来源:PAT乙级1067
作者:CHEN, Yue
单位:浙江大学