原题: https://www.patest.cn/contests/pat-b-practise/1067
思路: 又是一题重点放在怎么读入数据的问题, 我采用的是这种%[^
]
,
题目没有说明用户输入的密码最大有多长, 本来我是想采用读取前21个字符
这种操作来判断的, 但测试点无法通过, 索性直接开个500位的大数组完事,
主要就是把以下特殊情况考虑到了, 就没问题了.
- 用户的输入长度不定
- 一个#是结束, 2个##就不是了. 遇到#立马就结束程序, 不要打印回车
- 用户的输入中间可能有空格之类乱七八糟的字符, 不能用scnaf直接读取
- 这一题不能采用截断的方法只读取前20个字符, 因为即便是错误的密码
也要全部读取出来, 不然后面输出无法输出
实现:
#include <stdio.h>
#include <string.h>
#define LEN 21
int main (void) {
char rpwd[LEN]; // 正确密码
char upwd[500]; // 用户输入密码
int count; // 可尝试次数
scanf("%s %d", rpwd, &count);
getchar(); // 回车挡掉
while (1) {
scanf("%[^
]", upwd);
getchar(); // 回车挡掉
if (count == 0) {
printf("Account locked
");
break; // 尝试次数为0结束
} else if (strcmp(upwd, "#") == 0) {
break; // 读到#结束
} else if (strcmp(upwd, rpwd) == 0) {
printf("Welcome in
");
break; // 密码正确结束
} else {
printf("Wrong password: %s
", upwd);
count--;
}
}
return 0;
}