一次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",®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; }