1067 试密码 (20 point(s))

// 13 points
#include <bits/stdc++.h>
using namespace std;

int main() {
	string pass, check; int N;
	cin >> pass >> N;
	
	while(cin >> check){
		if(check == "#") {return 0;} 
		if(N == 0) {cout << "Account locked" << endl; return 0;}
		
		if(check == pass) {cout << "Welcome in" << endl; return 0;}
		else {cout << "Wrong password: " << check << endl; N--;} 
	}
}
#include <bits/stdc++.h>
using namespace std;

int main() {
	string pass, check; int N;
	cin >> pass >> N;
	// 吃掉 cin getline 之间的换行 
	getchar();
	while(getline(cin, check)){
		if(check == "#") {return 0;} 
		if(check == pass) {cout << "Welcome in" << endl; return 0;}
		else {cout << "Wrong password: " << check << endl; N--;} 
		if(N == 0) {cout << "Account locked" << endl; return 0;}
	}
}

最开始卡了三个测试点 2 4 5 。看了别人的分析改了两个问题。

一个是测试点2 5,题目说正确密码 “长度不超过 20 的、不包含空格、Tab、回车的非空字符串” 不包含空格,但是没有说输入密码的时候的字符串不包括空格,所以得用 getline() 而用 getline() 前面可能有为吃掉的换行(cin会吃掉一切空相关的字符,getline不会),所以还得手动吃掉换行,用 getchar() 。

可以额外记一下,看到这种输入样例的,并且是字符串类型的,整行整行类型最好考虑用 getline() 防止冷不丁,可能是自己没有看到题目描述,或者就是题目故意卡测试点。

测试点2 5

还有一个是题目的描述。

如果是错误的,则在一行中按格式输出 Wrong password: 用户输入的错误密码;当错误尝试达到 N 次时,再输出一行 Account locked,并结束程序

注意描述里面的 刚开始我还以为这两个是平行的判断关系,所以两个的位置没怎么注意,以为是在开头判断。但加了题目的再的话,说明这两个是递进的关系,意味着在错误的时候不仅仅要输出错误信息,还得判断这次错误之后是否已经没有尝试次数,从而输出信息结束程序(不得不说,后面这些题目越来越多读题上目的细节)。

所以把原来的判断为止换一下位置即可,在错误之后紧接着判断是否已经没有尝试次数,而不是进入下一次循环判断下一次输入。

测试点4

posted on 2021-09-07 17:48  Atl212  阅读(52)  评论(0)    收藏  举报

导航