C语言利用链表与文件实现登录注册功能

 更新时间:2020年12月28日 09:53:44   作者:Vecace  
这篇文章主要介绍了C语言利用链表与文件实现登录注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C语言实现简登录和注册功能,供大家参考,具体内容如下

C语言实现注册登录

使用链表
使用文件

版本二: 利用链表

此版本使用的链表,第一个版本使用的是数组

数组版本连接

这里我使用的线性链表,一定要注意在判断语句或赋值语句中不可将指针指向未定义的区域,这会产生很大问题,所以一般都需要在链表最后一个节点指向空指针

代码:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct LNode
{
 char name[10];
 char pass[10];
 struct LNode *next;
} LNode,*pNode;
//定义节点
pNode createList()
{
 //此函数是为了构造一个链表,存储用户信息用的。
 
 //链表头结点声明,这个头结点也就是链表的入口,你可以通过头结点,找到链表所有的数据
 pNode pHead = (pNode)malloc(sizeof(LNode));
 pHead->next=NULL;
 //头结点不存放数据
 
 //以读的方式打开user.txt文件
 FILE *fp = fopen("user.txt","r+");
 if(NULL == fp)
 {
 //如果没有该文件,则退出并显示未找到文件
  printf("FILE NOT FOUND");
  exit(-1);
 }
 
 //获取链表入口,也就是头结点
 pNode cur = pHead;
 while(1)
 {
 //从user.text循环读入所有数据并依次存于链表
 
 //先制造一个临时节点
  pNode temp = (pNode)malloc(sizeof(LNode));
  if(!temp)
   exit(-1);
   
 //下面fscanf是从文件读取信息,并存入节点的name变量和pass变量
  //如果fscanf的返回值不是2,则说明后面没有数据了,也即是录入完毕
 //检测到录入完毕后将分配的空间清除掉
  if(2!=fscanf(fp,"%s%s",temp->name,temp->pass))
  {
   free(temp);
   break;
  }
 
 //让当前节点(链表的尾部)的后面加上读取到数据的节点
  cur->next=temp;
 
 //让当前的节点为链表尾部
  cur = temp;

  //使最后一个节点指向空,方便以后判断
  cur->next = NULL;
 }
 return pHead;
}

//登录函数
int login(pNode head)
{
 if(NULL==head->next)
 {
  printf("user list empty\n");
  getchar();
  return 0;
 }
 char name[10];
 char pass[10];
 printf("enter your name:");
 scanf("%s",name);
 printf("enter your password:");
 scanf("%s",pass);
 pNode temp = head->next;
 while(temp)
 {
  if(0==strcmp(temp->name,name) && 0==strcmp(temp->pass,pass))
  {
   printf("success");
   getchar();
   return 1;
  }
  temp = temp->next;
 }
 printf("user not found");
 getch();
}

//写入txt文件,每一行存在一个用户
void writeToFile(pNode head)
{
 FILE *fw = fopen("user.txt","a+");
 pNode temp=head->next;
 if(temp==NULL){
  return;
 }
 while(temp){
  fprintf(fw,temp->name);
  fprintf(fw,"\t");
  fprintf(fw,temp->pass);
  fprintf(fw,"\n");
  temp = temp->next;
 }
}


//注册用户
void registerUser(pNode head)
{
 pNode temp = head->next;
 //当表中无用户直接在头结点后注册
 if(!temp)
 {
  temp = (pNode)malloc(sizeof(LNode));
  head->next = temp;
 }
 else
 {
  //表中有用户则在最后一个节点后生成新节点
  while(temp->next)
  {
   temp = temp->next;
  }
  pNode last = (pNode)malloc(sizeof(LNode));
  temp->next = last;
  temp = last;
 }
 printf("enter your name:");
 scanf("%s",temp->name);
 printf("enter your password:");
 scanf("%s",temp->pass);
 temp->next=NULL;
}

int menu()
{
 int choice;
 printf("1.login\n");
 printf("2.register\n");
 printf("#.exit\n");
 printf("enter your choice:");
 scanf("%d",&choice);
 return choice;
}

int main()
{
 int choice;
 pNode head = createList();
 while(1)
 {
  choice = menu();
  if(1==choice)
  {
   system("cls");
   if(login(head))
   {
    //这里写登陆成功的模块
   }
   system("cls");
  }
  else if(2==choice)
  {
   system("cls");
   registerUser(head);
   system("cls");
  }
  else
  {
   writeToFile(head);
   return 0;
  }
 }
}

运行结果

菜单,比较简陋,可以根据自己需求加东西

这次写了菜单的循环

注册

登录

异常路径(登录失败)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言版扫雷游戏

    C语言版扫雷游戏

    这篇文章主要为大家详细介绍了C语言版扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言 栈的表示和实现详细介绍

    C语言 栈的表示和实现详细介绍

    这篇文章主要介绍了C语言 栈的表示和实现详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12
  • C++自定义实现比较器

    C++自定义实现比较器

    这篇文章主要为大家详细介绍了如何使用C++自定义实现比较器,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • 简单掌握桶排序算法及C++版的代码实现

    简单掌握桶排序算法及C++版的代码实现

    桶排序是将要排序的算法按桶分组排序之后再遍历汇总的一种线性排序算法,下面就让我们来通过小例子简单掌握桶排序算法及C++版的代码实现^^
    2016-07-07
  • 对比C语言中的setbuf()函数和setvbuf()函数的使用

    对比C语言中的setbuf()函数和setvbuf()函数的使用

    这篇文章主要介绍了对比C语言中的setbuf()函数和setvbuf()函数的使用,涉及到缓冲区与流的相关知识,需要的朋友可以参考下
    2015-08-08
  • 举例剖析C++中引用的本质及引用作函数参数的使用

    举例剖析C++中引用的本质及引用作函数参数的使用

    这篇文章主要介绍了C++中引用的本质及引用作函数参数的使用,讲解了函数返回值是引用的情况等一些难点,需要的朋友可以参考下
    2016-03-03
  • C++实现一个线程安全的单例工厂实现代码

    C++实现一个线程安全的单例工厂实现代码

    这篇文章主要介绍了 C++实现一个线程安全的单例工厂实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • 浅谈int8_t int64_t size_t ssize_t的相关问题(详解)

    浅谈int8_t int64_t size_t ssize_t的相关问题(详解)

    下面小编就为大家带来一篇浅谈int8_t int64_t size_t ssize_t的相关问题(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • C语言 structural body结构体详解用法

    C语言 structural body结构体详解用法

    C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项,结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性
    2021-10-10
  • C语言实现旅游景点咨询系统

    C语言实现旅游景点咨询系统

    这篇文章主要为大家详细介绍了C语言实现旅游景点咨询系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12

最新评论