【IO进程线程】使用标准IO函数完成用户的登录和注册

 1 实现登录功能

自定义一个usr.txt,先手动输入其账户密码。

格式:账户 密码

例:

zhangsan 12345

lisi abcde

wangwu abc123

需求如下:

1. 从终端获取账户密码,与文件中的账户密码比较;

2. 若终端输入的账户不存在,则输出账户不存在;

3. 若终端输入的账户存在,但是密码不正确,则输出密码错误;

4. 若账户密码均正确,则输出登录成功。

方法一

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{char get_usrname[20]="";char get_usrpass[20]="";printf("请输入账号:");scanf("%s",get_usrname);printf("请输入密码:");scanf("%s",get_usrpass);FILE* fp=fopen("./usr.txt","r");if(NULL == fopen){perror("fopen");return -1;}char file_name[20];char file_pass[20];int flag=0;while(1){if(fscanf(fp,"%s %s",file_name,file_pass)==EOF)//从终端读取账号密码{flag=1;break;}if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)!=0){printf("密码错误!\n");break;}if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)==0){printf("登录成功!\n");break;}}if(flag==1){printf("该用户不存在!\n");}fclose(fp);
return 0;
}

方法二

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main(int argc, const char *argv[])                                                   
{char get_name[20] = "", get_passwd[20] = "";char file_name[20] = "", file_passwd[20] = "";//从终端获取账户密码printf("请输入账户和密码>>> ");scanf("%s %s", get_name, get_passwd);//以读的方式打开文件FILE* fp = fopen("./usr.txt", "r");if(NULL == fp){perror("fopen");return -1;}//循环读取文件的一行:账户  密码while(1){//将字符串清空bzero(file_name, sizeof(file_name));bzero(file_passwd, sizeof(file_passwd));if(fscanf(fp, "%s %s", file_name, file_passwd) == EOF){printf("%s 用户不存在\n", get_name);break;}//  printf("%s %s\n", file_name, file_passwd);//与终端获取到的账户密码比较if(strcmp(file_name, get_name) != 0)    //若账户名不相同,则去获取下一个账户密码continue;if(strcmp(file_passwd, get_passwd) != 0){printf("%s 密码错误\n", get_name);}else{printf("%s 用户登录成功\n", get_name);}break;      //若账户相同,则不需要继续往后比较其他用户了}//关闭文件fclose(fp);return 0;
}

2 实现注册功能

注册的账户密码存储在上一题的文件中。

需求:不能重复注册。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int log_on();
int regist();
int main(int argc, const char *argv[])
{/*一、实现登录功能。自定义一个usr.txt,手动输入账户密码,格式如下:账户 密码例如:  zhangsan  12345lisi  abcdewangwu abc123需求如下:1.从终端获取账户密码,与文件中的账户密码比较2.若终端输入的账户不存在,则输出账户不存在3.若终端输入的账户存在,但是密码不正确,则输出密码错误4.若账户密码均正确,则输出登录成功二、附加题实现注册功能,注册的账户密码存储在上一题的文件中。需求:不能重复注册。*/int choose;printf("请选择是注册用户(1)还是登录用户(2):");scanf("%d",&choose);if(choose!=1&&choose!=2){printf("选择失败!\n");return 0;}//注册else if(choose==1){regist();}//登录else{log_on();}return 0;
}
int log_on()
{char get_usrname[20]="";char get_usrpass[20]="";printf("请输入账号:");scanf("%s",get_usrname);printf("请输入密码:");scanf("%s",get_usrpass);FILE* fp=fopen("./usr.txt","r");if(NULL == fopen){perror("fopen");return -1;}char file_name[20];char file_pass[20];int flag=0;while(1){if(fscanf(fp,"%s %s",file_name,file_pass)==EOF)//从终端读取账号密码{flag=1;break;}if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)!=0){printf("密码错误!\n");int b=0;printf("请问是否要再次登录(0/1):");scanf("%d",&b);if(b==1){log_on();}break;}if(strcmp(file_name,get_usrname)==0 && strcmp(file_pass,get_usrpass)==0){printf("登录成功!\n");break;}}if(flag==1){printf("该用户不存在!\n");int b=0;printf("请选择是否要注册(0/1):");scanf("%d",&b);if(b==1){regist();}}fclose(fp);return 0;
}int regist()
{char get_usrname[20];char get_usrpass[20];printf("请输入注册账户:");scanf("%s",get_usrname);printf("请输入注册密码:");scanf("%s",get_usrpass);FILE* fp=fopen("./usr.txt","r");char file_name[20];char file_pass[20];int flag=0;while(1){if(fscanf(fp,"%s %s",file_name,file_pass)==EOF){flag=1;break;}if(strcmp(get_usrname,file_name)==0){printf("用户已存在!\n");int b=0;printf("请问是否直接选择登录(0/1):");scanf("%d",&b);if(b==1){log_on();}break;}}if(flag==1){fclose(fp);fp=fopen("./usr.txt","a+");fprintf(fp,"%s %s",get_usrname,get_usrpass);fputc(10,fp);printf("注册成功!\n");}fclose(fp);}

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

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

相关文章

商城-学习整理-高级-商城业务-Sentinel限流熔断降级Sleuth+Zipkin链路追踪(二十二)

目录 一、秒杀系统的架构二、SpringCloud Alibaba-Sentinel简介1、熔断降级限流什么是熔断什么是降级异同&#xff1a;什么是限流 2、Sentinel 简介官方文档&#xff1a;Sentinel 具有以下特征:Sentinel 分为两个部分: 3、Hystrix 与 Sentinel 比较4、整合 FeignSentinel 测试熔…

微服务集成spring cloud sentinel

目录 1. sentinel使用场景 2. sentinel组成 3. sentinel dashboard搭建 4. sentinel客户端详细使用 4.1 引入依赖 4.2 application.properties增加dashboard注册地址 4.3 手动增加限流配置类 4.4 rest接口及service类 4.5 通过dashboard动态配置限流规则 1. sentinel使…

Vue3项目实战

目录 一、项目准备 二、基础语法应用 2.1、mixin应用 2.2、网络请求 2.3、显示与隐藏 2.4、编程式路由跳转 2.5、下载资料 2.6、调用方法 2.7、监听路由变化 2.8、pinia应用 (1)存储token(user.js) (2)全选全不选案例(car.js) 一、项目准备 下载&#xff1a; cnp…

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

mybatis-plus如何使用枚举类来实现性别和标签的数字带描述

文章目录 目录 文章目录 前言 一、环境准备 二、使用步骤 一 实体类 二 枚举类 三 持久层 四 控制层 总结 前言 枚举是一种表示一组有限可能取值的数据类型。它具有以下几个好处&#xff1a; 易于理解和维护&#xff1a;枚举提供了一种清晰明了的方式来表示一组具体的取值&a…

【Linux操作系统】线程的基本知识和创建--循环创建多个子线程

本篇文章主要介绍了线程的概念和作用&#xff0c;线程三级映射的实现&#xff0c;创建线程的方法&#xff08;讲解pthread_self和pthread_create函数&#xff09;&#xff0c;循环创建多个子线程为例子&#xff0c;同时分析线程之间的全局变量的共享问题&#xff0c;希望可以帮…

Redis笔记——(狂神说)待续

Nosql概述 为什么要用NoSql&#xff1f; 1、单机mysql的年代&#xff1a;90年代&#xff0c;网站访问量小&#xff0c;很多使用静态网页html写的&#xff0c;服务器没压力。 当时瓶颈是&#xff1a;1)数据量太大一个机器放不下。2)数据的索引(BTree)&#xff0c;一个机器内存也…

Git最简入门

文章目录 几个基本概念版本控制Git的由来分布式 vs 集中式GitSVN Git、GitHub、GitLab、GitWeb、Gitee的区别 动手进行版本控制初始化Git使用情景一&#xff1a;开发新项目使用情景二&#xff1a;在已有项目上开发设置代理 参考 几个基本概念 版本控制 在工作学习中&#xff…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

基于 Alpine 环境源码构建 alibaba-tengine(阿里巴巴)的 Docker 镜像

About Alpine&#xff08;简介&#xff09; Alpine Linux 是一款极其轻量级的 Linux 发行版&#xff0c;基于 busybox&#xff0c;多被当做 Docker 镜像的底包&#xff08;基础镜像&#xff09;&#xff0c;在使用容器时或多或少都会接触到此系统&#xff0c;本篇文章我们以该镜…

Pydev·离线git包

Pydev离线git包 1.下载离线git包&#xff1a;eclipse.egit.repository-4.4.0.201606070830-r.zip 2.将解压后目录&#xff1a;eclipse.egit.repository-4.4.0.201606070830-r\plugins下的jar文件放到 ide\eclipse\plugins目录下 3.重启pydevIDE 百度搜索站长工具&#xff1a;h…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

校对的力量:当专业遇上细节,文字焕发新生

在这个信息爆炸的时代&#xff0c;文字成为了我们传达思想、展现形象的重要工具。从新闻稿、政府材料到商业文档&#xff0c;其背后的准确性和专业性往往决定了信息传递的效果。而保证这一切的&#xff0c;就是细致入微的校对工作。 1.错别字与校对&#xff1a;细节之美 错别字…

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…

vue离线缓存资源文件

本文章主要是解决大文件,实时请求资源浪费网络资源的问题 从而有效的将解决用户体验的问题 话不多说上才艺 ⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 找到项目中的 index.html 文件,并在 html 标签中加入 manifest"manifest.appcache" 安装 appcache-manifest 包 npm ins…

c++ qt--信号与槽(二) (第四部分)

c qt–信号与槽(二) &#xff08;第四部分&#xff09; 信号与槽的关系 1.一对一 2.一对多 3.多对一 4.多对多 还可以进行传递 信号->信号->槽 一个信号控制多个槽的例子&#xff08;通过水平滑块控制两个组件&#xff09; 1.应用的组件 注意这里最下面的组件进行…

【Qt学习】06:事件与事件过滤器

OVERVIEW 事件与事件过滤器一、事件1.鼠标事件创建子类MyLabel重写鼠标事件提升Label控件为MyLabel 2.定时器事件timerEventQTimer 3.事件分发器&#xff08;event函数&#xff09;event函数重写event函数深入 二、事件过滤器1.事件过滤器2.事件处理的五个层次 事件与事件过滤器…

Tomcat和Servlet基础知识的讲解(JavaEE初阶系列16)

目录 前言&#xff1a; 1.Tomcat 1.1Tomcat是什么 1.2下载安装 2.Servlet 2.1什么是Servlet 2.2使用Servlet来编写一个“hello world” 1.2.1创建项目&#xff08;Maven&#xff09; 1.2.2引入依赖&#xff08;Servlet&#xff09; 1.2.3创建目录&#xff08;webapp&a…

VR法治警示教育:情景式课堂增强教育效果

VR法治警示教育平台是一款基于虚拟现实技术的在线教育平台&#xff0c;旨在通过模拟真实场景和互动体验&#xff0c;向公众普及法律知识&#xff0c;提高公民的法律意识和素养。该平台采用先进的虚拟现实技术&#xff0c;将用户带入一个逼真的仿真环境&#xff0c;让用户身临其…