密码输入检测

文章目录

    • 题目描述
    • 输入描述
    • 输出描述
    • 示例一
    • 说明
    • 代码
    • 解释

题目描述

给定用户密码输入流 input,输入流中字符’<'表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。

密码安全要求如下:

密码长度>=8;
密码至少需要包含 1 个大写字母;
密码至少需要包含 1 个小写字母;
密码至少需要包含 1 个数字;
密码至少需要包含 1 个字母和数字以外的非空白特殊字符
注意空串退格后仍然为空串,且用户输入的字符串不包含‘<’字符和空白字符。

输入描述

用一行字符串表示输入的用户数据,输入的字符串中‘<’字符标识退格,用户输入的字符串不包含空白字符,例如:ABC<c89%000<

输出描述

输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由‘,’分隔, 例如:ABc89%00,true

示例一

输入
ABC<c89%000<
1
输出
ABc89%00,true
1

说明

解释:多余的 C 和 0 由于退格被去除,最终用户输入的密码为 ABc89%00,且满足密码安全要求,输出 true

代码

//密码输入检测
#include<stdio.h>
#include<ctype.h>//提供字符分类函数,如 isupper 和 isdigit。
#include <string.h>
#include <stdlib.h>
#include<stdbool.h>
//接受字符数组 input_stream 作为输入,表示带有潜在退格符的密码。
char *process(char *ch){//char* 表示指向字符(char)类型的指针,这里的 process_password 函数定义接受一个指向字符数组(即字符串)的指针作为参数。//函数返回值前面的星号同样表明它返回的是一个指向字符的指针,也就是一个字符串。char stack[1000];//使用堆栈来处理密码int top=0;for(int i=0;ch[i]!='\0';++i){char cur=ch[i];//将字符压入堆栈,但退格符 (<) 会删除前一个字符。if(cur=='<'){if(top>0){top--;}}else{stack[top]=cur;top++;}}//返回包含已处理密码的新字符数组。char *password=malloc(top+1);for(int i=0;i<top;++i){password[i]=stack[i];}password[top]='\0';return password;
}//检查密码安全要求
int check(char *password){int length_check=strlen(password)>=8;//密码长度>=8;int uppercase_check=0;int lowercase_check=0;int digit_check=0;int special_char_check=0;for(int i=0;password[i]!='\0';++i){if(isupper(password[i])) uppercase_check=1;//密码至少需要包含 1 个大写字母;else if(islower(password[i])) lowercase_check=1;//密码至少需要包含 1 个小写字母;else if(isdigit(password[i])) digit_check=1;//密码至少需要包含 1 个数字;else if(!isalnum(password[i]) && !isspace(password[i])) special_char_check=1;}return length_check && uppercase_check && lowercase_check && digit_check && special_char_check;
}int main(){char ch[1000];fgets(ch,sizeof(ch),stdin);ch[strcspn(ch,"\n")]='\0';//去除 input_stream 字符串末尾的换行符(\n)。//strcspn(input_stream, "\n") 用来指示位置//当 \n 出现在双引号 " 内时,它是一个有效的转义序列// '\n'和"\n"有 区别,'\0'和"\0"没有区别 char *password=process(ch);bool is_valid=false;if(check(password)){is_valid=true;}printf("%s,%d\n",password,is_valid);free(password);return 0;
}

解释

头文件

  • stdio.h:提供标准输入输出函数,如 printffgets
  • ctype.h:提供字符分类函数,如 isupperisdigit

函数

  • process(char* input_stream)
    • 接受字符数组 input_stream 作为输入,表示带有潜在退格符的密码。
    • 使用堆栈来处理密码:
      • 将字符压入堆栈,但退格符 (<) 会删除前一个字符。
    • 返回包含已处理密码的新字符数组。
  • check(char* password)
    • 接受密码作为输入。
    • 检查是否满足某些要求:
      • 长度至少为 8 个字符。
      • 包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符。
    • 如果密码满足所有要求,返回 1,否则返回 0。

主函数(main)

  1. 读取输入
    • 使用 fgets 从用户读取一行输入并将其存储在 input_stream 中。
    • 使用 strcspn 从输入中删除任何换行符 (\n)。
  2. 处理密码
    • 调用 process 来删除退格符并获取实际密码。
  3. 检查密码要求
    • 调用 check 来确定密码是否符合标准。
  4. 打印输出
    • 打印已处理的密码和一个 1 或 0 来指示其是否有效。
  5. 释放内存
    • 使用 free 释放用于处理密码的动态分配内存。

总结

该代码有效地处理带有退格符的密码输入,并根据特定要求检查其是否有效,然后打印处理后的密码及其有效性状态。

以下是一些具体的解释:

  • process() 函数使用一个堆栈来处理密码。当遇到一个字符时,如果该字符不是退格符,则将其压入堆栈。如果该字符是退格符,则将堆栈中的顶部字符弹出。这意味着在处理完成后,堆栈中只包含密码中的有效字符。
  • check() 函数检查密码是否符合以下要求:
    • 长度至少为 8 个字符。
    • 包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符。
    • 特殊字符是指除了字母和数字之外的任何字符。
  • 主函数首先使用 fgets() 从用户读取一行输入。然后,它使用 strcspn() 从输入中删除任何换行符。接下来,它调用 process() 来处理密码。然后,它调用 check()来检查密码是否符合要求。最后,它打印密码及其有效性状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 处理JSON字符串

目录 前言 JSON值的部分更新 创建JSON值 JSON 值的规范化、合并和自动包装 合并JSON值 搜索和修改JSON值 JSON路径 JSON值的比较和排序 JSON值的聚合 前言 现在很多数据会以json格式存储&#xff0c;如果你还在用like查询json字符串&#xff0c;那你就OUT了&#xff0…

详解 Kruskal 算法的实现

一、算法原理 Kruskal 算法用于求最小生成树&#xff0c;它的主要思路是基于并查集&#xff0c;算法的主要原理如下&#xff1a; 假设图中有 n 个点&#xff0c;则&#xff1a; step 1&#xff1a;Kruskal 算法假定初始时每个点都只属于自己所在的并查集&#xff08;即初始时…

有趣的css - 简约的动态关注按钮

页面效果 此效果主要使用 css 伪选择器配合 css content 属性&#xff0c;以及 transition(过渡)属性来实现一个简约的动态按钮效果。 此效果可适用于关注按钮、详情按钮等&#xff0c;增强用户交互体验。 核心代码部分&#xff0c;简要说明了写法思路&#xff0c;看 css 部分的…

AUTOSAR内存篇 -Flash EEPROM Emulation(FEE)

文章目录 简介功能介绍通常行为寻址机制和分段地址计算擦除循环次数的限制“立即”数据的处理管理块正确性信息缓存对齐API介绍类型定义函数定义Fee_InitFee_ReadFee_WriteFee_CancelFee_GetStatus<

一文详解docker swarm

文章目录 1、简介1.1、涉及到哪些概念&#xff1f;1.2、需要注意什么&#xff1f; 2、集群管理2.1、创建集群2.2、将节点加入集群2.3、查看集群状态。2.4、将节点从集群中移除2.5、更新集群2.6、锁定/解锁集群 3、节点管理4、服务部署4.1、准备4.2、服务管理4.2.1、常用命令4.2…

[C++]继承(续)

一、基类和派生类对象赋值转换 在public继承时&#xff0c;父类和子类是一个“is - a”的关系。 子类对象赋值给父类对象/父类指针/父类引用&#xff0c;我们认为是天然的&#xff0c;中间不产生临时对象&#xff0c;也叫作父子类赋值兼容规则&#xff08;切割/切片&#xff…

idea查看日志的辅助插件 --- Grep Console (高亮、取消高亮)

&#x1f680; 分享一款很有用的插件&#xff1a;Grep Console &#x1f680; 我们在查看日志的时候可能会有遗漏&#xff0c;使用这款插件可以让特定的关键词高亮&#xff0c;可以达到不遗漏的效果&#xff01; 如果你是一个开发者或者对日志文件分析感兴趣&#xff0c;不要…

记录一次使用ant design 中 ConfigProvider来修改样式导致样式改变的问题(Tabs嵌套Tabs)

一 说明 继之前的一篇文章&#xff1a;antd5 Tabs 标签头的文本颜色和背景颜色修改 后&#xff0c;发现在被修改后的Tab中继续嵌套Tabs组件&#xff0c;这个新的Tabs组件样式跟外层Tabs样式也是一致的&#xff0c;如下图所示&#xff1a; 二 原因 在修改外层tabs样式时&…

Axios 和 Ajax 的区别

一、Axios 和 Ajax 的区别 1、Axios是一个基于Promise的HTTP库&#xff0c;而Ajax是对原生XHR的封装&#xff1b; 2、Ajax技术实现了局部数据的刷新&#xff0c;而Axios实现了对ajax的封装。 二、Axios 和 Ajax 的区别及优缺点 1、什么是Ajax Ajax是对原生XHR的封装&#xff0…

又涨又跌 近期现货黄金价格波动怎么看?

踏入2024年一月的下旬&#xff0c;现货黄金价格可以说没了之前火热的状态&#xff0c;盘面上是又涨又跌。面对这样的行情&#xff0c;很多投资者不知道如何看了。下面我们就来讨论一下怎么把握近期的行情。 先区分走势类型。在现货黄金市场中有两种主要的走势类型&#xff0c;一…

【SpringCloud】使用OpenFeign进行微服务化改造

目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…

《区块链简易速速上手小册》第10章:区块链的未来与趋势(2024 最新版)

文章目录 10.1 区块链的未来展望10.1.1 基础知识10.1.2 主要案例&#xff1a;区块链在金融领域的发展10.1.3 拓展案例 1&#xff1a;区块链在供应链管理中的应用10.1.4 拓展案例 2&#xff1a;区块链在身份管理和隐私保护中的应用 10.2 新兴技术与区块链的融合10.2.1 基础知识1…

【已解决】QT如何加载qss文件

翻阅我的博客&#xff0c;发现没有写这方面文章&#xff0c;qt如何加载qss文件。今天补上一篇关于qt如何加载qss文件。写完这篇博客&#xff0c;未来有相关问题&#xff0c;直接可以从博客里去搜。 解决方案 在项目里写完qss文件&#xff0c;在main文件里只需要追加这句话。 …

智能家居的网关新形态:Aqara 方舟智慧中枢 M3 体验

如果说在刚刚结束的 2023 年有哪些备受期待的智能家居产品&#xff0c;Aqara 方舟智慧中枢 M3 一定榜上有名&#xff0c;我的多位朋友也曾在装修过程中多次向我询问是否有这款产品的相关资讯&#xff1b;谁能想到自从在 2022 年 11 月首次亮相之后&#xff0c;这款产品一直等了…

vulhub靶机activemq环境下的CVE-2015-5254(ActiveMQ 反序列化漏洞)

影响范围 Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 远程攻击者可以制作一个特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象&#xff0c;利用该漏洞执行任意代码。 漏洞搭建 没有特殊要求&#xff0c;请看 (3条消息) vulhub搭建方法_himobrinehacken的博客-CSD…

iOS图像处理----探索图片解压缩到渲染的全过程以及屏幕卡顿

一&#xff1a;图像成像过程 ①、将需要显示的图像&#xff0c;由CPU和GPU通过总线连接起来&#xff0c;在CPU中输出的位图经总线在合适的时机上传给GPU &#xff0c;GPU拿到位图做相应位图的图层渲染、纹理合成。 ②、将渲染后的结果&#xff0c;存储到帧缓存区&#xff0c;帧…

堆解决贪心问题

502题&#xff0c;最小代价实现最大化IPO class Solution {/*本质还是贪心&#xff0c;只不过多了需要满足贪心的条件而已&#xff0c;首先由于启动资金是固定的&#xff0c;你得从小往大去观察哪些最小资本合适&#xff0c;这就需要定义一个pair&#xff0c;最小资本最大利润…

centos7常用命令之安装插件2

centos7安装插件1 7、kibana 【启动kibana,需要调整这个配置文件(/opt/kibana-6.3.0/config/kibana.yml)的一处ip地址,因为每次虚拟机的ip地址可能会有所不同&#xff0c; 同时访问页面地址的ip:5601时,ip地址也对应修改】 1.解压缩包 cd /opt/ tar -xvf kibana-6.3.0-linux-x…

【脑电信号处理与特征提取】P7-贾会宾:基于EEG/MEG信号的大尺度脑功能网络分析

基于EEG/MEG信号的大尺度脑功能网络分析 Q: 什么是基于EEG/MEG信号的大尺度脑功能网络分析&#xff1f; A: 基于脑电图&#xff08;EEG&#xff09;或脑磁图&#xff08;MEG&#xff09;信号的大尺度脑功能网络分析是一种研究大脑活动的方法&#xff0c;旨在探索脑区之间的功能…

【JavaSE篇】——继承

目录 &#x1f393;继承 ✅为什么需要继承 ✅继承概念 ✅继承的语法 ✅父类成员访问 &#x1f6a9;子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量的情况 2. 子类和父类成员变量同名 &#x1f6a9;子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员…