今天用C語言做了一個簡單的用戶登錄注冊存取款等功能的系統,發現有很多功能並不會實現,大概是使用Java太多了導致許多C的知識都忘記了,現在把碰到的問題總結如下:
1、字符串復制問題
java等一些編程語言使用習慣了我們經常會用
String s1 = "abc";String s2 = s1
這種方式來給字符串賦值,但C語言一般使用的是char[]數組來存儲字符串,所以在賦值的時候不可以使用單純的賦值符"=",使用的是string.h頭文件中包含的strcpy函數。如:
char a[20]; char b[20]; strcpy(a,b);
這樣可以實現將b的值賦值給a。
2、字符串分隔問題
Java分隔字符串有專門的split函數來實現,C語言也有專門的函數實現,下面是一個實例:
char *p; char StrLine[10] = “a;b;c”; p = strtok(StrLine,";"); while(p != NULL){ printf("%s\n",p); p = strtok(NULL,";"); }
strtok函數:
原型:char *strtok(char s[], const char *delim);
介紹:分解字符串為一組字符串。s為要分解的字符,delim為分隔符字符(如果傳入字符串,則傳入的字符串中每個字符均為分割符)。首次調用時,s指向要分解的字符串,之后再次調用要把s設成NULL。
3、字符串轉數字問題
例如現在有int a[3]={'1','2','3'}一個一維數組,如果要將其轉換為123這個數字,我們可以這樣:
1)計算a的長度,假設為n
2)分別將a[0]~a[n-1]轉換為數字
3)這個數字就等於a[0]*10n-1+a[1]*10n-2+...+a[n-1]*100
這種方法確實可以實現,但是這種方法一是費時間二是費內存。
所以C語言有一個函數可以實現這種功能:atoi(a):
int atoi(const char *nptr) 函數會掃描參數 nptr字符串,會跳過前面的空白字符(例如空格,tab縮進)等。如果 nptr不能轉換成 int 或者 nptr為空字符串,那么將返回 0 。特別注意,該函數要求被轉換的字符串是按十進制數理解的。
附上簡單實現用戶登錄注冊存款取款修改密碼的C語言代碼:
#include<stdio.h> #include<string.h> #include<stdlib.h> //定義結構體User代表每一個用戶 struct User{ char username[20];//用戶名 char password[20];//密碼 int deps;//存款數 }; struct User users[100];//用戶數組 struct User loginUser;//記錄當前登錄用戶 int usersCount = 0;//用戶數量,默認為0 //讀取文件信息 /* 由於讀取文件過程中會自動讀取所有數據下面的一個空行, 所以導致讀取的userCount即用戶數出現錯誤,比實際大一, 所以在執行完讀取文件后,userCount需要減一 */ void GetFileInfo(){ char *p; char datas[3][30]; int i = 0; char fileName[] = "users.txt"; FILE *fp; char StrLine[1024]; if((fp = fopen(fileName,"r")) == NULL) { printf("讀取用戶信息失敗!"); return; } while(!feof(fp)) { i = 0; fgets(StrLine,1024,fp); p = strtok(StrLine," "); while(p != NULL){ strcpy(datas[i++],p); //printf("%s\n",p); p = strtok(NULL," "); } strcpy(users[usersCount].username,datas[0]); strcpy(users[usersCount].password,datas[1]); users[usersCount].deps = atoi(datas[2]); usersCount ++; } usersCount -= 1; fclose(fp); printf("讀取用戶信息成功~\n"); } //寫入文件 void Update(){ int i = 0; FILE *fp; fp = fopen("users.txt","w"); fclose(fp); fp = fopen("users.txt","w"); for(i = 0; i < usersCount; i++){ fprintf(fp,"%s %s %d\n",users[i].username,users[i].password,users[i].deps); } fclose(fp); } //注冊功能 struct User regist(){ char regist_username[20]; char regist_password[20]; struct User newUser; printf("請輸入用戶名:"); scanf("%s",®ist_username); printf("請輸入六位密碼:"); scanf("%s",®ist_password); while(regist_password[5]==NULL||regist_password[6]!=NULL){ printf("密碼必須是6位數,請重新輸入密碼:"); scanf("%s",®ist_password); } strcpy(newUser.username,regist_username); strcpy(newUser.password,regist_password); newUser.deps = 0;//新注冊用戶余額為0 printf("注冊成功!用戶:%s\n",regist_username); return newUser; } //執行完操作后更新數組 void update(struct User user){ int i; for(i = 0; i < usersCount; i++){ if(strcmp(users[i].username,user.username) == 0){ users[i] = user; break; } } } //登錄后菜單選擇 void menu(){ void Welcome(); int oper; int deposit; int withdraw; char oldPass[20]; char newPass[20]; printf("***********\n"); printf("請選擇:\n"); printf("1、存款\n"); printf("2、取款\n"); printf("3、查看余額\n"); printf("4、修改密碼\n"); printf("5、返回\n"); printf("***********\n"); scanf("%d",&oper); switch(oper){ case 1: printf("請輸入要存款的數額:"); scanf("%d",&deposit); loginUser.deps += deposit; printf("存款成功!余額為:%d\n",loginUser.deps); update(loginUser); Update(); menu(); break; case 2: printf("請輸入要取款的數額:"); scanf("%d",&withdraw); if(loginUser.deps >= withdraw){ loginUser.deps -= withdraw; printf("取款成功!余額為:%d\n",loginUser.deps); }else{ printf("余額不足!\n"); } update(loginUser); Update(); menu(); break; case 3: printf("用戶:%s,您的余額為:%d\n",loginUser.username,loginUser.deps); menu(); break; case 4: printf("請輸入原密碼:"); scanf("%s",&oldPass); if(strcmp(oldPass,loginUser.password) == 0){ printf("請輸入新密碼:"); scanf("%s",&newPass); while(newPass[5]==NULL||newPass[6]!=NULL){ printf("密碼必須是6位數,請重新輸入密碼:"); scanf("%s",&newPass); } strcpy(loginUser.password,newPass); printf("更改密碼成功!\n"); }else{ printf("原密碼輸入錯誤!\n"); } update(loginUser); Update(); menu(); break; case 5: Welcome(); } } //登錄功能 void login(){ void Welcome(); char login_username[20]; char login_password[20]; struct User checkUser; int i; printf("請輸入用戶名:"); scanf("%s",&login_username); printf("請輸入密碼:"); scanf("%s",&login_password); for(i = 0; i < usersCount; i++){ if(strcmp(login_username,users[i].username) == 0){ if(strcmp(login_password,users[i].password) == 0){ loginUser = users[i]; printf("用戶 %s歡迎登錄!\n",login_username); menu(); }else{ printf("密碼輸入錯誤!\n"); Welcome(); } } } printf("沒有這個用戶!將返回\n"); Welcome(); } //歡迎界面 void Welcome(){ int select = 0; struct User user; printf("*********************\n"); printf("歡迎來到ATM自助系統\n"); printf("*********************\n"); printf("請選擇操作:\n1、用戶登錄\n2、用戶注冊\n3、退出系統\n"); scanf("%d",&select); if(select == 1){ login(); menu(); }else if (select == 2){ user = regist(); users[usersCount] = user; usersCount += 1; Update(); Welcome(); }else if (select == 3){ printf("退出成功!"); exit(0); }else{ printf("輸入錯誤!將退出系統"); exit(0); } } //主函數 int main() { GetFileInfo(); Welcome(); return 0; }
