题目描述;
当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死。本题就请你实现这个小功能。
输入格式:
输入在第一行给出一个密码(长度不超过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和vector会更加简便。相关注意点我在代码中注明了,请看代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
string password,unsure; //正确答案password,每次尝试的答案unsure
vector<string> ve; //存储每次尝试的答案
int n; //系统允许尝试次数
cin>>password>>n;
getchar(); //需要把第一行的换行符吸收掉,因为尝试的答案可能有空格,使用cin遇到空格就停止了
//需要使用getline,遇到换行符停止输出,没有getchar,那么第一次的尝试将会读不到任何东西
while(1){
getline(cin,unsure); //读入
if(unsure=="#"){ //读入#后立马中断,这一句不能放放在ve.push-back后面,因为这样的话#也会进去
//最终导致如果n大于用尝试的次数 ,最后会输出wrong password: #。这样就错误了
break;
}
ve.push_back(unsure);
}
for(int i=0;i<ve.size() ;i++){ //对所有尝试过的答案继续核对
if(ve[i]==password){
cout<<"Welcome in"; //如果正确答案,输出,结束程序
break;
}
else{
cout<<"Wrong password: "<<ve[i]<<endl; //如果不是正确答案,按照格式输出
n--; //剩余尝试次数减一
}
if(n==0){ //如果尝试次数用完了,输出lock,终止程序
cout<<"Account locked";
break;
}
}
}