zoukankan      html  css  js  c++  java
  • 一次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
    ",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
    ",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("读取用户信息成功~
    ");
    }
    
    //写入文件
    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
    ",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
    ",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("***********
    ");
        printf("请选择:
    ");
        printf("1、存款
    ");
        printf("2、取款
    ");
        printf("3、查看余额
    ");
        printf("4、修改密码
    ");
        printf("5、返回
    ");
        printf("***********
    ");
        scanf("%d",&oper);
        switch(oper){
            case 1:
                printf("请输入要存款的数额:");
                scanf("%d",&deposit);
                loginUser.deps += deposit;
                printf("存款成功!余额为:%d
    ",loginUser.deps);
                update(loginUser);
                Update();
                menu();
                break;
            case 2:
                printf("请输入要取款的数额:");
                scanf("%d",&withdraw);
                if(loginUser.deps >= withdraw){
                    loginUser.deps -= withdraw;
                    printf("取款成功!余额为:%d
    ",loginUser.deps);
                }else{
                    printf("余额不足!
    ");
                }
                update(loginUser);
                Update();
                menu();
                break;
            case 3:
                printf("用户:%s,您的余额为:%d
    ",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("更改密码成功!
    ");
                }else{
                    printf("原密码输入错误!
    ");
                }
                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欢迎登录!
    ",login_username);
                    menu();
                }else{
                    printf("密码输入错误!
    ");
                    Welcome();
                }
            }
        }
        printf("没有这个用户!将返回
    ");
        Welcome();
    }
    
    //欢迎界面
    void Welcome(){
        int select = 0;
        struct User user;
        printf("*********************
    ");
        printf("欢迎来到ATM自助系统
    ");
        printf("*********************
    ");
        printf("请选择操作:
    1、用户登录
    2、用户注册
    3、退出系统
    ");
        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
  • 相关阅读:
    Luogu3119 [USACO15JAN]Grass Cownoisseur G
    BZOJ4361 isn
    洛谷1330 封锁阳光大学
    codechef AUG17 T2 Chef and Mover
    codechef AUG17 T1 Chef and Rainbow Array
    【bzoj3211】花神游历各国&&【bzoj3038】上帝造题的七分钟2
    noip 瑞士轮 ————归并排序解法
    记录string的妙用
    洛谷P1550 [USACO08OCT]打井Watering Hole
    汕头市队赛 SRM 09 C 撕书
  • 原文地址:https://www.cnblogs.com/guo-xu/p/10498628.html
Copyright © 2011-2022 走看看