一次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

 

posted @ 2019-03-08 22:24  编程小大白  阅读(2080)  评论(0编辑  收藏  举报