一次C語言編程遇到的問題總結


今天用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",&regist_username);
    printf("請輸入六位密碼:");
    scanf("%s",&regist_password);
    while(regist_password[5]==NULL||regist_password[6]!=NULL){
        printf("密碼必須是6位數,請重新輸入密碼:");
        scanf("%s",&regist_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;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM