基于Linux下的C語言項目實戰--本地賬號管理系統
時間:2019-10-21 來源:成都中心,張老師
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語言項目實戰的開發流程,所以選用項目較為簡單,代碼不是最優。如果想深入而又專業的了解,請聯系我們。

