1067 试密码 (20 分)

题目:1067 试密码 (20 分)

当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。

输入格式:

输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。

输出格式:

对用户的每个输入,如果是正确的密码且尝试次数不超过 N,则在一行中输出 Welcome in,并结束程序;如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序。

输入样例 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

思路:

  • 用string可以直接进行判断两个字符串是否相等,方便简洁,包含在string头文件中。用户输入的密码里可能会不小心带有空格等,所以采用getline()输入字符串,直接用cin测试点2、5会错。但在使用getline()前要用getchar()吸收回车。
  • 判断出结束符#就计数程序,若是正常字符串则判断是否是正确密码,对应输出题目格式要求。记得错误超过可输入的最大次数就要锁定账户并终止程序。

代码:

 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include 
 8 #include <string>  //string
 9 #include 
10 #include 
11 #include 
12 #include 
13 using namespace std;
14 
15 int main()
16 {
17     string cpw, pw;
18     int n;
19     cin >> cpw >> n;
20     getchar();
21     int cnt = 0;
22     while(getline(cin, pw))
23     {
24         if(pw == "#")
25             break;
26         else if(pw != cpw)
27         {
28             cout << "Wrong password: " << pw << endl;
29             cnt++;
30             if(cnt >= n)
31             {
32                 printf("Account locked\n");
33                 break;
34             }                
35         }            
36         else
37         {
38             cout << "Welcome in" << endl;
39             break;    //密码正确结束程序 
40         }        
41     }    
42     return 0;
43 }

 

总结:

  首发测试点2、5错。猜测是用户输入的密码里可能不小心带有了空格等。于是改用getline()输入,结果全部答案错误。在输入正确密码和次数后用getchar()吸收回车就解决。其次,发现PTA其实是个不是很苛刻的oj (可能是我认知太少造成的片面误解)。
  使用getline()前要用getchar()吸收回车。

你可能感兴趣的:(1067 试密码 (20 分))