P1067 试密码

转跳点:

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

坑啊,这道题,简直狗到爆啊,测试点2一直没过,3个小时就一直在debug,太狗了……

第一个坑点(最坑的地方): 第一行给出的密码和数字后面不一定紧跟换行符就这一点就把我坑惨了一定要注意

第二个坑点:用户输入没有任何限制,没错,测试点毛限制都没有,可能会有空格,可能不止20个字符,可能……(就像我们当初用软件瞎搞的时候,真是风水轮流转)

有个麻烦的地方就是输入与正确密码的比较如果存储成字符数组的话每一次比较都需要,而且个人不太擅长处理字符串,所以我把密码按ASCII码给加起来了,每次输入的字符都加起来,然后和密码的大小相比,这样子可以避免坑点二2 输入字符过长的问题,就算按输入100个127也就12700。不过很显然这种思路是有问题的ab和ba就没有办法识别,但是把,在PAT上居然A了……我没有管用户多余的输入(好吧这不太好)

我第一次AC的代码(无法识别ab 和ba的区别):

#include <stdio.h>
#include <stdlib.h> int PasswordSum(int mode); char Word[23] = "\0"; int main(void)
{
char ch;
int n, i, Password, sum = 0; Password = PasswordSum(0); scanf("%d", &n);
getchar(); for (i = 0; i < n; i++)
{
sum = PasswordSum(1);
if (((int)'#') == sum)
{
break;
}
if (sum == Password)
{
printf("Welcome in\n");
break;
}
printf("Wrong password: %s\n", Word);
} if (i == n)
{
printf("Account locked");
} return 0;
} int PasswordSum(int mode)
{
char ch, BKCh;
int i = 0, sum = 0; BKCh = 1 == mode ? '\n' : ' '; while (BKCh != (ch = getchar()))
{
sum += ch - '\0';
Word[i++] = ch;
}
Word[i] = '\0'; return sum;
}

第二次AC代码:

这次用了点正则,大部分使用了内置函数库我每次只读20个字符或者读到换行,达到这样的目的,使用了scanf("%20[^\n]")[^...]能够读取到^后边的字符,而不是%s读到空白字符。 如果用户还有输入,再一个个读取字符,一直输出到换行,这样保证了程序的健壮性。

#include <ctype.h>
#include <stdio.h>
#include <string.h> int main()
{
int n;
char ch, Password[21], user[21]; scanf("%s %d", Password, &n);
while (getchar() != '\n')
;
while (n--)
{
scanf("%20[^\n]", user);
ch = ungetc(getchar(), stdin);
if (!strcmp(user, "#") && ch == '\n')
{
break;
}
else if (!strcmp(Password, user) && ch == '\n')
{
puts("Welcome in");
break;
}
else
{
printf("Wrong password: %s", user);
while (putchar(getchar()) != '\n')
;
if (0 == n)
{
puts("Account locked");
}
}
} return 0;
}

PTA不易,诸君共勉!

P1067 试密码的更多相关文章

  1. PAT 乙级 1067 试密码(20 分)

    1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...

  2. PAT 1067 试密码(20)(代码)

    1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...

  3. PAT(B) 1067 试密码(Java)

    题目链接:1067 试密码 (20 point(s)) 题目描述 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格 ...

  4. PAT1067 试密码 (20分)——测试点4分析 一个易错点

    1067 试密码 (20分)   当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码( ...

  5. PAT 1067 试密码

    https://pintia.cn/problem-sets/994805260223102976/problems/994805266007048192 当你试图登录某个系统却忘了密码时,系统一般只 ...

  6. PAT 1067. 试密码(20)

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过20的.不包含空格.Ta ...

  7. PAT - 1067 试密码 (20 分)

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...

  8. PAT Basic 1067 试密码 (20 分)

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...

  9. 1067 试密码 (20分)C语言

    当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度不超过 20 的.不包含空格. ...

随机推荐

  1. Mysql 8.0 新特性测试

    Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...

  2. table 实现向下滑动首行冻结,向右滑动左列冻结

    <html> <head> <meta charset="utf-8"> <title>测试</title> <M ...

  3. 「NOI2009」植物大战僵尸

    「NOI2009」植物大战僵尸 传送门 这是一道经典的最大权闭合子图问题,可以用最小割解决(不会的可以先自学一下) 具体来说,对于这道题,我们对于两个位置的植物 \(i\) 和 \(j\) ,如果 \ ...

  4. liux vim 命令

    清除所有行 先 gg 再 dG

  5. BugkuCTF解题Web基础(一)

    Web2 打开链接看见一张动图,猜测flag应该就在网页前端源码里面 没有问题 计算器 典型的修改前端代码题目,题目让你计算结果,但只能填写一位数字. f12打开控制台,改代码maxlength we ...

  6. 树莓派4B踩坑指南 - (2)安装系统及初始化

    安装系统及初始化 格式化TF卡:SDFormatter 4.0.如果需要换系统,则必须先烧录进一个空img,然后再格式化! 烧录系统:Win32DiskImager-0.9.5 更改默认密码:账号pi ...

  7. Xftp和Xshell

    Xftp 用于跟云虚拟机文件传输的工具,Xftp官网 Xshell Xftp的兄弟工具,用于执行云虚拟机命令,Xshell官网 两个都是付费工具,各需要几百块钱,当然破解的版本也很多 登陆 这两个的连 ...

  8. SpringMVC 接收表单数据、数据绑定、解决请求参数中文乱码

    接收表单数据有3种方式. 1.使用简单类型接收表单数据(绑定简单数据类型) 表单: <form action="${pageContext.request.contextPath}/u ...

  9. Python 面试问答 Top 25

    Python 是一种解释型,交互式,面向对象的高级编程语言.和别的一些使用标点符号的语言不同,Pythons使用了大量的英语单词作为关键字,因而具有很好的可读性.而且跟其他编程语言相比,它有更少的语法 ...

  10. 「国家集训队」小Z的袜子

    「国家集训队」小Z的袜子 传送门 莫队板子题. 注意计算答案的时候,由于分子分母都要除以2,所以可以直接约掉,这样在开桶算的时候也方便一些. 参考代码: #include <algorithm& ...