【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  12345
	   lisi  abcde
	   wangwu 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);

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpeedBI数据可视化工具:丰富图表,提高报表易读性

数据可视化工具一大作用就是能把复杂数据可视化、直观化&#xff0c;更容易看懂&#xff0c;也就更容易实现以数据驱动业务管理升级&#xff0c;因此一般的数据可视化工具都会提供大量图形化的数据可视化图表&#xff0c;以提高报表的易懂性&#xff0c;更好地服务企业运营决策…

websocket和uni-app里使用websocket

一、HTTP是无状态协议 特点&#xff1a; 1、浏览器发送请求时&#xff0c;浏览器和服务器会建立一个连接。完成请求和响应。在http1.0之前&#xff0c;每次请求响应完毕后&#xff0c;会立即断开连接。在http1.1之后&#xff0c;当前网页的所有请求响应完毕后&#xff0c;才断…

prometheus + grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

ctfshow-web13 文件上传

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面&#xff0c;测试其他无果&#xff0c;遂进行目录遍历&#xff0c;发现upload.php.bak文件 可以看到这里的限制条件&#xff0c;大小&#xff0c;以及内容&#xff0c;这里可以使用.use…

渗透测试漏洞原理之---【XSS 跨站脚本攻击】

文章目录 1、跨站 脚本攻击1.1、漏洞描述1.2、漏洞原理1.3、漏洞危害1.4、漏洞验证1.5、漏洞分类1.5.1、反射性XSS1.5.2、存储型XSS1.5.3、DOM型XSS 2、XSS攻防2.1、XSS构造2.1.1、利用<>2.1.2、JavaScript伪协议2.1.3、时间响应 2.2、XSS变形方式2.2.1、大小写转换2.2.2…

基于Red Hat Enterprise Linux 7操作系统的PostgresSql15的备份恢复(实践笔记)

零、前言 本文是基于阿里云ECS服务器进行的实践操作&#xff0c;操作系统版本&#xff1a;Red Hat Enterprise Linux 7 PG数据库版本&#xff1a;PostgresSql 15 PG安装方式&#xff1a;yum 由于本人新接触pg数据&#xff0c;本次也是出于好奇&#xff0c;就对pg数据库的pg_du…

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现BES-ELM秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效…

软考A计划-系统集成项目管理工程师-小抄手册(共25章节)-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

谷歌面试-扔鸡蛋

今天想跟大家分享一个有意思的面试题&#xff0c;这让我再一次感叹思维的奇妙&#xff0c;接下来我们一起看看吧~ 首先来看看题目&#xff1a; 你有2颗鸡蛋&#xff0c;需要以最少的尝试次数来判断在100层的高楼上&#xff0c;哪一层楼是鸡蛋的安全层。 换句话说&#xff0c…

不同子网络中的通信过程

从输入www.baidu.com经历了什么 一、DNS&#xff08;网址->IP&#xff09; 二、ARP&#xff08;IP->MAC&#xff09; A->B&#xff1a;有数据发送&#xff0c;数据封装ip之后发现没有主机B的mac地址。然后ARP在本网段广播&#xff1a;检查目标地址和源地址是否在同一…

springboot源码编译问题

问题一 Could not find artifact org.springframework.boot:spring-boot-starter-parent:pom:2.2.5.RELEASE in nexus-aliyun (http://maven.aliyun.com/nexus/content/groups/public/) 意思是无法在阿里云的镜像仓库中找到资源 解决&#xff1a;将配置的镜像删除即可&#…

【SkyWalking】分布式服务追踪与调用链系统

1、基本介绍 SkyWalking是一个开源的观测平台&#xff0c;官网&#xff1a;Apache SkyWalking&#xff1b; 可监控&#xff1a;分布式追踪调用链 、jvm内存变化、监控报警、查看服务器基本配置信息。 2、SkyWalking架构原理 在整个skywalking的系统中&#xff0c;有三个角色&am…

4.18 TCP 和 UDP 可以使用同一个端口吗?

目录 TCP 和 UDP 可以同时绑定相同的端口吗&#xff1f; 多个 TCP 服务进程可以绑定同一个端口吗&#xff1f; 重启 TCP 服务进程时&#xff0c;为什么会有“Address in use”的报错信息&#xff1f; 重启 TCP 服务进程时&#xff0c;如何避免“Address in use”的报错信息…

【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)

文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后&#xff0c;一鼓作气&#xff0c;把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…

Postman —— postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数每…

Docker安装及Docker构建简易版Hadoop生态

一、首先在VM创建一个新的虚拟机将Docker安装好 更新系统&#xff1a;首先打开终端&#xff0c;更新系统包列表。 sudo apt-get update sudo apt-get upgrade下图是更新系统包截图 安装Docker&#xff1a;使用以下命令在Linux上安装Docker。 sudo apt-get install -y docker.i…

python爬虫实战零基础(3)——某云音乐

爬取某些云网页音乐&#xff0c;无需app 分析网页第二种方式批量爬取 声明&#xff1a;仅供参考学习&#xff0c;参考&#xff0c;若有不足&#xff0c;欢迎指正 你是不是遇到过这种情况&#xff0c;在pc端上音乐无法下载&#xff0c;必须下载客户端才能下载&#xff1f; 那么&…

开源与数据科学:一个完美的组合?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

JMeter性能测试(上)

一、基础简介 界面 打开方式 双击 jmeter.bat双击 ApacheJMeter.jsr命令行输入 java -jar ApacheJMeter.jar 目录 BIN 目录&#xff1a;存放可执行文件和配置文件 docs目录&#xff1a;api文档&#xff0c;用于开发扩展组件 printable-docs目录&#xff1a;用户帮助手册 li…

Springboot_Redis

Springboot默认使用lettuce操作redis,底层是netty jdeis并发差些 Redis的Template 分为两种, 一种是StringRedisTemplate&#xff0c;另一种是RedisTemplate 根据不同的数据类型&#xff0c;大致的操作也分为这5种&#xff0c;以StringRedisTemplate为例 stringRedisTempla…