密码问题(函数、字符串、指针)(航电2043题改版)(c++)
【问题描述】
假设一个比较安全的密码至少应该满足下面两个条件:
(1)密码长度大于等于8,且不要超过16。
(2)密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C…Z;
2.小写字母:a,b,c…z;
3.数字:0,1,2…9;
4.特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
请设计函数bool Password(char *str)实现之。
【输入形式】
测试实例包含一个密码(长度最大为50),密码仅包括上面的四类字符。
【输出形式】
对于测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
【样例输入】
a1b2c3d4
【样例输出】
NO
题目难点
- 密码长度要控制在8到16位,可是密码又是用户输入的。若想知道一个输入的字符串长度,我们可以使用一个新的函数strlen(),这个函数在头文件#include 中定义,当然你也可以自己编写实现这个函数的功能,见“补充”部分
- strlen()的功能:是一个计数器,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。 知道了其功能,所以我们初始给数组分栈的时候要把内存全部初始化为’\0’
- 用ASCII码来判断数组每个单元格内存储的字符符不符合标准
代码1:
#include <iostream>
#include <cstring>
using namespace std;
bool Password(char *str);//声明 bool型函数,其参数是字符型指针,
//其与bool Password(char str[]);在功能上是一致的
int main()
{
char s[50]="";//测试密码长度最大为 50,且这个空串初始化在“笔记”板块会详讲
cin>>s;
int len = strlen(s);//算长度
if( len>=8 && len<=16 )//判断长度知否符合规定
{
if(Password(s))//符合题意
cout<<"YES"<<endl;
else//不符合题意
cout<<"NO"<<endl;
}
else//字符数不在范围内的
cout<<"NO"<<endl;
return 0;
}
bool Password(char *str)
{
int a=0,b=0,c=0,d=0;
for(int j=0;str[j];j++)//也是用结束符号'\0'来判断循环体
{
if( str[j]<='z' && str[j]>='a' ) a=1;//只要数组中有一个字符满足是小写字母的要求就把a赋值为1
if( str[j]<='Z' && str[j]>='A') b=1;//大写字母同理
if( str[j]<='9' && str[j]>='0') c=1;//数字同理
if( str[j]=='~' || str[j]=='!' || str[j]=='@' || str[j]=='#' || str[j]=='$' || str[j]=='%' || str[j]=='^' ) d=1;
}//特殊符号同理
if( a+b+c+d >= 3 ) return 1;//即如果四者中满足三者就返回真值1
return 0;
}
笔记:
- 把字符型数组初始化为空串的三种方法:
(1) char str[10] = “”;
(2) char str[10] = { ‘\0’ };
(3) char str[10]; str[0] = ‘\0’; - 字符数组初始化:
(1) char str[6] = { ‘C’, ‘h’, ‘i’, ‘n’, ‘a’, ‘\0’ };
(2) char str[6] = {“China”};
(3) char str[6] = “China”;
补充拷贝代码:
#include <iostream>
using namespace std;
void mystrcpy(char *dest, const char *source);//函数声明
int main()
{
//......
}
void mystrcpy(char *dest, const char *source)//拷贝函数定义
{
while( *dest++ = *source++);
}