基于Linux下的C语言项目实战--本地账号管理系统
C语言开发项目实战:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多平台正常编译运行。
C语言是一种面向过程的语言,它的先天特性决定了它并不适合写出美观的GUI界面,而在这个地方笔者选择使用C语言来实现用户登录的设计只是为了让大家感受C语言项目实战开发的过程。所以,后续描述不会像在公司当中实际项目开发文档描述一样官方、精确。

一.项目需求:
1.用户控制台;
2.功能需求,能够进行用户账号密码的注册存储、比对;
二.项目设计:
根据需求我们可以知道:
1.界面布局应当有账号密码的输入,这意味着我们在代码当中需要用户、密码标识,这个我们可以使用标准C库提供的printf函数在终端打印;同时需求用户、密码的输入的接口,这个我们可以使用标准C库提供的scanf或者gets函数去实现;同理,登录、注册、退出选项也可以直接使用上述函数实现,具体布局情况,可由个人而定。
2.根据功能需求,针对用户数据的比对我们最好采用现有的成熟的数据库去实现,但这个地方我们只讲C语言的实际应用,所以,我们可以采用C语言已有的一些数据类型去实现这样的功能。当然这也会限制我们这个程序的性能。我们可以发现:用户和密码,这两者之间的关系是应该是一一对应的,所以我们可以采用结构体的形式,实现用户和其对应密码的“捆绑”。而我们用户又不应该只有一个,所以可以采用结构体数组的形式,实现用户数据的存储。(这样的设计会有一个无法避免的问题,当程序结束,内存被释放,结构体数组内部所有数据消失。如果你还学了文件IO,我想你已经可以解决这样的问题了。)
3.用户登录时,数据的比对目前我们可以通过遍历比对,实现登录功能。而未来当问题规模庞大之后,还是应当使用数据库去管理相关数据,实现最优。
三.项目编码:
1.我们可以采用比较专业的做法,将文件进行分割成多个源文件的形式,这个比较基础,方便后续展示,笔者决定采用最“LOW”的方式,简单粗暴的把所有东西放在一个文件中;
2.具体代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct data{
char name[20]; //存储用户名
char pass[20]; //存储密码
}user_data;
user_data user[20] = {0}; //能够保存20个用户的结构体数组
int last = 0; //标志位,标记已经注册账户的数目
bool reg_string(void)
{
int i = 0, n;
if(last >= 20){
return false;
}
char name[20] = {0}, pass[20] = {0};
printf("please input your usrname:\n");
xxx:
scanf("%s", name);
getchar(); //读取脏字符
for(i = 0; i < last; i++){
n = strcmp(name, user[i].name);
if(0 == n){
printf("该用户已注册\n");
goto xxx; //若用户名相同,则跳转重新输入
}
}
printf("please input your usrpassword:\n");
scanf("%s", pass);
strcpy(user[last].name, name);
strcpy(user[last].pass, pass);
last++;
printf("注册成功\n");
return true;
}
bool log_string(void)
{
if(0 == last){
return false;
}
int i, n, m;
char name[20] = {0}, pass[20] = {0};
printf("please input your usrname:\n");
scanf("%s", name);
getchar();
printf("please input your usrpassword:\n");
scanf("%s", pass);
getchar();
for(i = 0; i < last; i++){
//strcmp 函数返回值为"0"则表示两字符串相同
n = strcmp(user[i].name, name);
m = strcmp(user[i].pass, pass);
if(n == 0 && m == 0){
//未来可以提供其它接口,实现各种自定义功能
printf("登录成功!\n");
return true;
}
}
//当程序执行到这一步,意味着结构体数组遍历完毕,未找到匹配的用户和 //密码
printf("用户或密码错误\n");
return false;
}
int main()
{
int n;
while(1){
//实现界面布局
printf("***************************************\n");
printf("*****1.注册*****2.登录*****3.退出*****\n"); printf("***************************************\n");
xxx:
scanf("%d", &n);
getchar();
switch(n){
case 1:
//应该在调用时做好返回值的判断,看对应函数是否正确调用
reg_string();
break;
case 2:
log_string(); //登录
break;
case 3:
return 0;
default:
goto xxx;
}
}
}
注:
本次主要是为了介绍C语言项目实战的开发流程,所以选用项目较为简单,代码不是最优。如果想深入而又专业的了解,请联系我们。
基于Linux下的C语言项目实战--本地账号管理系统的更多相关文章
- Linux运维企业架构项目实战系列
Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...
- 在 Linux 下学习 C 语言有什么好处?
作者:宅学部落链接:https://www.zhihu.com/question/23893390/answer/832610610来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- Linux 下 expect 脚本语言中交互处理常用命令
Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...
- 在Linux下开始C语言的学习
为什么要在linux下学习C语言? linux下可以体验到最纯粹的C语言编程,可以抛出其他IDE的影响 环境配置简单,一条命令就足够.甚至对于大多数linux发行版本,都已经不需要配置C语言的环境 查 ...
- 基于Linux下catalog方式的 Oracle 备份策略(RMAN)
--********************************** -- 基于Linux下 Oracle 备份策略(RMAN) --******************************* ...
- linux下后台启动springboot项目
linux下后台启动springboot项目 我们知道启动springboot的项目有三种方式: 运行主方法启动 使用命令 mvn spring-boot:run”在命令行启动该应用 运行“mvn p ...
- linux下的C语言开发 进程创建 延伸的几个例子
在Linux下面,创建进程是一件十分有意思的事情.我们都知道,进程是操作系统下面享有资源的基本单位.那么,在linux下面应该怎么创建进程呢?其实非常简单,一个fork函数就可以搞定了.但是,我们需要 ...
- 基于Linux下Iptables限制BT下载的研究
基于Linux下Iptables限制BT下载的研究 摘要: 当前BT下载技术和软件飞速发展,给人们网上冲浪获取资源带来了极大的便利, 但同时BT占用大量的网络带宽等资源也给网络和网络管理员 ...
- linux下后台启动springboot项目(转载)
我们知道启动springboot的项目有三种方式: 运行主方法启动 使用命令 mvn spring-boot:run”在命令行启动该应用 运行“mvn package”进行打包时,会打包成一个可以直接 ...
随机推荐
- 02-NVIDIA Jetson TX2 通过JetPack 3.1刷机完整版(踩坑版)
未经允许,不得擅自改动和转载 文 | 阿小庆 2018-1-20 本文继第一篇文章:01-NVIDIA Jetson TX2开箱上电显示界面 TX2 出厂时,已经自带了 Ubuntu 16.04 系统 ...
- Angular全局数据管理与同步更新
自定义实现angular中数据的状态管理,如有不妥请指正 一.先介绍一下rxjs中subject: Import {subject}from’rxjs’ Subject 数据的订阅与分发,结合报刊的发 ...
- scp、wget
scp使用方法 -1 强制scp命令使用协议ssh1 -2 强制scp命令使用协议ssh2 -4 强制scp命令只使用IPv4寻址 -6 强制scp命令只使用IPv6寻址 -B 使用批处理模 ...
- Android Studio Madual作为application的使用以及工作空间和modual的区别
Android Studio Madual作为application的使用以及工作空间和modual的区别 前言: 写这篇文章的目的是因为自己使用Android Studio开发时进入了一个误区,后面 ...
- HZNU-ACM寒假集训Day10小结 树-树形DP
树形DP 加分二叉树 洛谷P1040 注意中序遍历的特点:当根节点编号k时,编号小于k的都在其左子树上,编号大于k的都在右子树 转移方程 f[i,j]=max{f[i,k-1]*f[k+1,j]+d[ ...
- 201771010123汪慧和《面向对象程序设计Java》第十六周实验总结
一.理论部分 1.程序与进程的概念 ‐程序是一段静态的代码,它是应用程序执行的蓝本. ‐进程是程序的一次动态执行,它对应了从代码加载.执行至执行完毕的一个完整过程. ‐操作系统为每个进程分配一段独立的 ...
- Json字符串转Java对象和List集合
对象POJO和JSON互转 public class JsonUtil { /** * JSON 转 POJO */ public static <T> T getObject(Strin ...
- MySQL 表查询语句练习题
MySQL 表查询语句练习题: 一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表 ...
- VC++ DLL 3 动态链接库
前面先介绍了静态链接库的方式提供了函数结构的方法,现在就来说下,如果用非MFC的动态链接库要怎么实现,这个过程稍微复杂一点点,但是基本也都是一个套路下来. 1.新建一个工程: 2.编写cpp文件和头文 ...
- PL/SQL 连接oracle步骤
下面就将PL/SQL的配置说明一下. 一.安装Oracle客户端,让后配置 安装目录下面的C:\ORACLE\instantclient_11_2\NETWORK\ADMIN 的 tnsname ...