有偿!不难 通过文件读写实现用户注册,要识别用户id是否存在
现在只能识别第一行(第一个)用户
```c
#include
#include
#include
typedef struct UserData
{
char userID[20];
char userName[20];
char userSex;
char userNumber[20];
char userPass[20];
char userEmail[30];
char userAddress[50];
float usermoney;
}userdata;
void Regist()
{
userdata a={0},b={0};
char temp[20];
char tempid[20];
int q=0;
int t=0;
char tempmoney[50];
char* tmoney;
int n=0;
FILE *pf;
userdata local[20];
pf=fopen("userdata.txt","r");
if(pf==NULL)
{
printf("打开注册文件失败\n");
return;
}
while(!feof(pf))
{
fscanf(pf,"%s %s %s %s %s %s %s %f",local[q].userID,local[q].userName,local[q].userSex,local[q].userNumber,local[q].userPass,local[q].userEmail,local[q].userAddress,&local[q].usermoney);
q++;
}
printf("欢迎注册超市用户账号!( ´∀`)\n");
printf("请输入你的用户ID:\n");
scanf("%s",tempid);
for ( t = 0 ; t < q ; t++)
{
if(strcmp(tempid,local[t].userID)==0)
{
printf("该ID已被用户注册,请输入新的用户ID");
scanf("%s",tempid);
}
else
{
strcpy(a.userID,tempid);
printf("您的ID为:%s",a.userID);
break;
}
}
printf("请输入姓名:\n");
scanf("%s",a.userName);
printf("请输入性别(f(女)/m(男)):\n");
scanf("%c",&a.userSex);
do
{
if(a.userSex != 'f' && a.userSex != 'm')
{
printf("性别输入错误!请重新输入!\n");
scanf("%c",&a.userSex);
}
}while(a.userSex != 'f' && a.userSex != 'm');
getchar();
printf("请输入电话号码:\n");
scanf("%s",a.userNumber);
printf("请输入密码\n");
scanf("%s",a.userPass);
printf("请确认密码\n");
scanf("%s",temp);
do
{
if(strcmp(a.userPass,temp)==0)
{
printf("账号注册成功,请输入邮箱\n");
fclose(pf);
break;
}
else
{
printf("两次密码不匹配!请重新输入!\n");
scanf("%s",a.userPass);
printf("请确认密码\n");
scanf("%s",temp);
}
}while(1);
getchar();
scanf("%s",a.userEmail);
printf("请输入地址\n");
scanf("%s",a.userAddress);
printf("请输入您的余额:");
scanf("%f",&a.usermoney);
pf = fopen("userdata.txt","a");
fwrite(&a, sizeof(struct UserData), 1, pf);
fclose(pf);
return;
}
int main()
{
int input=-1;
do
{
printf("\t\t\t----------------------------------\n");
printf("\t\t\t| 1.登录 |\n");
printf("\t\t\t| 2.注册 |\n");
printf("\t\t\t| 0.退出 |\n");
printf("\t\t\t----------------------------------\n");
printf("请选择您想进行的操作\n");
scanf("%d",&input);
switch(input)
{
case 2:Regist();break;
case 0:puts("退出成功"); return 0;
}
}while(1);
return 0;
}
```
这是我以前写的,和你要求的功能相同的代码,有对识别用户id是否存在,同时密码输入里有对输入密码(六位[数字+字符])位数的检查及数字与字符位数的要求,供参考:
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct The_users
{
char id[100];
char password[20];
char phone[12];
char mailbox[100];
struct The_users* next;
}users;
void add_users(char* s = NULL)
{
FILE* fp;
errno_t err;
int count = 0, i = 0, flg = 0, flag = 0;
char name_id[100], password[20], phone[12], mailbox[100];
if ((err = fopen_s(&fp, "users.txt", "a")) != 0)
printf("文件打开失败!\n");
else {
if (s == NULL){
printf("新建用户名:");
scanf_s("%s", name_id, (int)sizeof(name_id));
}
else
strcpy(name_id, s);
do {
printf("请输入密码(六位[数字+字符]):");
scanf_s("%s", password, (int)sizeof(password));
count = strlen(password);
for (i = 0, flg = 0, flag = 0; i < count; i++)
if (isdigit(password[i]))
flg++;
else
flag++;
} while (count != 6 || flg == 0 || flag == 0);
printf("请输入电话:");
scanf_s("%s", phone, (int)sizeof(phone));
printf("请输入邮箱:");
scanf_s("%s", mailbox, (int)sizeof(mailbox));
fprintf(fp, "%s %s %s %s\n", name_id, password, phone, mailbox);
fclose(fp);
printf("恭喜,您的账号注册成功!\n");
}
}
void registers()
{
char name_id[100], password[20], phone[12], mailbox[100];
users* head, * tail, * p;
FILE* fp;
errno_t err;
printf("欢迎来到注册界面!\n");
if ((err = fopen_s(&fp, "users.txt", "r")) != 0){
add_users();
}
else {
head = NULL, tail = NULL, p = NULL;
while (1)
{
if (fscanf(fp, "%s %s %s %s\n", name_id, password, phone, mailbox) != 4) break;
p = (users*)malloc(sizeof(struct The_users));
p->next = NULL;
strcpy(p->id, name_id); strcpy(p->password, password);
strcpy(p->phone, phone); strcpy(p->mailbox, mailbox);
if (head == NULL)
head = p;
else
tail->next = p;
tail = p;
}
fclose(fp);
do {
printf("新建用户名:");
scanf("%s", name_id);
tail = head;
while (tail != NULL && strcmp(tail->id, name_id) != 0)
{
tail = tail->next;
}
if (tail == NULL)
add_users(name_id);
else
printf("该用户名已经被注册,请重新输入!\n");
} while (tail != NULL);
}
return;
}
int login()
{
char name_id[100], password[20], phone[12], mailbox[100];
users* head, * tail, * p;
errno_t err;
FILE* fp;
int i = 0, flg = 0;
if ((err = fopen_s(&fp, "users.txt", "r")) != 0){
printf("无注册用户,请先注册用户。\n");
}
else {
printf("欢迎来到登录界面\n");
head = NULL, tail = NULL, p = NULL;
while (1)
{
if (fscanf(fp, "%s %s %s %s\n", name_id, password, phone, mailbox) != 4) break;
p = (users*)malloc(sizeof(struct The_users));
p->next = NULL;
strcpy(p->id, name_id); strcpy(p->password, password);
strcpy(p->phone, phone); strcpy(p->mailbox, mailbox);
if (head == NULL)
head = p;
else
tail->next = p;
tail = p;
}
fclose(fp);
printf("请输入用户名:");
scanf_s("%s", name_id, (int)sizeof(name_id));
tail = head;
while (tail != NULL && strcmp(tail->id, name_id) != 0)
{
tail = tail->next;
}
if (tail != NULL)
{
do {
printf("密 码:");
scanf_s("%s", password, (int)sizeof(password));
if (strcmp(tail->password, password) == 0)
{
printf("登录成功!\n");
return 1;
}
else {
i++;
if (i != 3)
printf("输入密码错误,还有%d次机会,请重新输入!\n", 3 - i);
else {
printf("输入密码错误,3次机会已用完,退出登录!\n");
break;
}
}
} while (strcmp(tail->password, password) != 0);
}
else
printf("该用户名不存在!\n");
}
return 0;
}
int main()
{
int n;
while (1)
{
printf("***********菜单*************\n");
printf("** 1:登录 **\n");
printf("** 2:注册 **\n");
printf("** 3:退出 **\n");
printf("***************************\n");
printf("请输入1-3编号:");
scanf_s("%d", &n);
if (n == 2)
registers();
else if (n == 3)
break;
else if (n == 1)
login();
}
return 0;
}
printf("请输入姓名:\n");
scanf("%s",a.userName);
printf("请输入性别(f(女)/m(男)):\n");
scanf("%c",&a.userSex);
这种写法都是有问题的,性别根本没有输入,直接接收输入姓名后的换行符了
需要在姓名输入完后,增加一个getchar();接收到换行符才行
你这个差的有点远,一个函数咋能完成你说那么多功能呢。你可以参考这篇文章
https://blog.csdn.net/weixin_64811333/article/details/126108201
问题有点多啊,
A。 结构体的初始化不是你那样的;
B。读完文件就close 留着干嘛?
C。第一个for 循环,
如果存在了,你会再次scanf,进入下次循环,但是,你要知道再次进循环,之前的就没有再比较了,因为 t++了;
D。 do while循环,改成while ,里面的if 可以不用
可以看看我写的这个
#include<stdio.h>
#include<windows.h>
#define Max 25
#define obj_num 5
struct Stu
{
char Name[25]; //姓名
int Number; //学号
int Language_score;//语文成绩
int Math_score; //数学成绩
int English_score; //英语成绩
int PE_score; //体育成绩
int C_score; //C语言成绩
int Sum_score; //总成绩
};
void input(struct Stu Class[],int j)
{
printf("输入第%d位同学姓名:",j+1);
scanf("%s",Class[j].Name);
getchar();
printf("输入第%d位同学学号:",j+1);
scanf("%d",&Class[j].Number);
printf("输入第%d位同学语文成绩:",j+1);
scanf("%d",&Class[j].Language_score);
printf("输入第%d位同学数学成绩:",j+1);
scanf("%d",&Class[j].Math_score);
printf("输入第%d位同学英语成绩:",j+1);
scanf("%d",&Class[j].English_score);
printf("输入第%d位同学体育成绩:",j+1);
scanf("%d",&Class[j].PE_score);
printf("输入第%d位同学C语言成绩:",j+1);
scanf("%d",&Class[j].C_score);
Class[j].Sum_score=Class[j].Language_score+Class[j].Math_score+Class[j].English_score+Class[j].PE_score+Class[j].C_score;
}
void output(struct Stu Class[],int n)
{
printf("---------------------------------------------\n");
printf("姓名 学号 语文 数学 英语 体育 C语言 总分");
printf("\n");
int j;
for(j=0; j<n; j++)
{
printf("%5s",Class[j].Name);
printf("%5d",Class[j].Number);
printf("%6d",Class[j].Language_score);
printf("%6d",Class[j].Math_score);
printf("%6d",Class[j].English_score);
printf("%6d",Class[j].PE_score);
printf("%6d",Class[j].C_score);
printf("%7d",Class[j].Sum_score);
printf("\n");
}
printf("---------------------------------------------\n");
}
void outputOne(struct Stu Class[],int j)
{
printf("姓名 学号 语文 数学 英语 体育 C语言 总分");
printf("\n");
printf("%5s",Class[j].Name);
printf("%5d",Class[j].Number);
printf("%6d",Class[j].Language_score);
printf("%6d",Class[j].Math_score);
printf("%6d",Class[j].English_score);
printf("%6d",Class[j].PE_score);
printf("%6d",Class[j].C_score);
printf("%7d",Class[j].Sum_score);
printf("\n");
}
void Sort(struct Stu Class[],int n)
{
int j,k;
struct Stu t;
for(j=0; j<n-1; j++)
{
for(k=0; k<n-j-1; k++)
{
if(Class[k].Sum_score<Class[k+1].Sum_score)
{
t=Class[k];
Class[k]=Class[k+1];
Class[k+1]=t;
}
}
}
}
int search(int number,int n,struct Stu Class[])
{
int i,p=0;
for(i=0; i<n; i++)
{
if(Class[i].Number==number)
{
p=i;
return p;
}
}
return -1;
}
void modify(int number,int n,struct Stu Class[])
{
int index=search(number,n,Class);
if(index==-1)
{
printf("找不到该学号\n");
}
else
{
printf("学号%d的学生是第%d位\n",number,index+1);
input(Class,index);
printf("修改成功\n");
output(Class,n);
}
}
void del(int number,int n,struct Stu Class[])
{
int index=search(number,n,Class);
if(index==-1)
{
printf("找不到该学号\n");
}
else
{
printf("学号%d的学生是第%d位\n",number,index);
int i;
for(i=index; i<n-1; i++)
{
Class[i]= Class[i+1];
}
printf("删除成功\n");
output(Class,n-1);
}
}
double calave(int n,struct Stu Class[],double ave[])
{
int Language_score_sum=0;
int Math_score_sum=0;
int English_score_sum=0;
int PE_score_sum=0;
int C_score_sum=0;
for(int i=0; i<n; i++)
{
Language_score_sum+=Class[i].Language_score;
Math_score_sum+=Class[i].Math_score;
English_score_sum+=Class[i].English_score;
PE_score_sum+=Class[i].PE_score;
C_score_sum+=Class[i].C_score;
}
ave[0]=(double)Language_score_sum/n;
ave[1]=(double)Math_score_sum/n;
ave[2]=(double)English_score_sum/n;
ave[3]=(double)PE_score_sum/n;
ave[4]=(double)C_score_sum/n;
}
void save(int n,struct Stu Class[])
{
FILE *fp;
fp = fopen("score_data.txt","w");
if(fp == NULL)
{
printf("error!");
return;
}
else
{
for(int j=0; j<n; j++)
{
fprintf(fp,"%s %d %d %d %d %d %d %d\n",Class[j].Name,Class[j].Number,Class[j].Language_score,Class[j].Math_score,Class[j].English_score,Class[j].PE_score,Class[j].C_score,Class[j].Sum_score);
}
printf("文件写入成功\n");
}
fclose(fp);
}
int read(int n,struct Stu Class[])
{
FILE *fp;
fp = fopen("score_data.txt","r");
int count=0;
if(fp == NULL)
{
printf("error!");
return 0;
}
else
{
for(int j=0; j<n; j++)
{
int flag=fscanf(fp,"%s %d %d %d %d %d %d %d\n",Class[j].Name,&Class[j].Number,&Class[j].Language_score,&Class[j].Math_score,&Class[j].English_score,&Class[j].PE_score,&Class[j].C_score,&Class[j].Sum_score);
if(flag!=-1) count++;
}
printf("文件读取成功\n");
}
fclose(fp);
return count;
}
void menu(struct Stu Class[])
{
int n=0,count;
int option=1;
while(option<=9&&option>=1)
{
printf("------------------------\n");
printf("------学生成绩管理------\n");
printf("------1.输入成绩 ------\n");
printf("------2.输出成绩 ------\n");
printf("------3.按总成绩排序----\n");
printf("------4.按学号查询成绩--\n");
printf("------5.修改信息 ------\n");
printf("------6.删除学生 ------\n");
printf("------7.计算各科平均分--\n");
printf("------8.文件读入 ------\n");
printf("------9.保存至文件------\n");
printf("------other.退出 ------\n");
printf("------------------------\n");
printf("输入选项:");
scanf("%d",&option);
switch(option)
{
case 1:
{
system("cls");
printf("输入学生的个数(不大于%d):",Max-n);
scanf("%d",&count);
while(count--)
{
input(Class,n++);
}
output(Class,n);
break;
}
case 2:
{
system("cls");
output(Class,n);
break;
}
case 3:
{
system("cls");
Sort(Class,n);
output(Class,n);
break;
}
case 4:
{
system("cls");
int number;
printf("输入要查找的学号:");
scanf("%d",&number);
int index=search(number,n,Class);
if(index==-1)
{
printf("查找失败\n");
}
else
{
printf("查找成功\n");
outputOne(Class,index);
}
break;
}
case 5:
{
system("cls");
output(Class,n);
int number;
printf("输入要修改成绩的学生对应的学号:");
scanf("%d",&number);
modify(number,n,Class);
output(Class,n);
break;
}
case 6:
{
system("cls");
output(Class,n);
int number;
printf("输入要删除的学号:");
scanf("%d",&number);
del(number,n,Class);
n--;
system("cls");
output(Class,n);
break;
}
case 7:
{
system("cls");
output(Class,n);
double ave[obj_num];
calave(n,Class,ave);
char str[]="平均分";
printf("\n");
printf("%5s",str);
printf(" ");
printf("%5.2lf",ave[0]);
printf("%6.2lf",ave[1]);
printf("%6.2lf",ave[2]);
printf("%6.2lf",ave[3]);
printf("%6.2lf",ave[4]);
printf("\n");
break;
}
case 8:
{
system("cls");
n-=n;
n+=read(Max,Class);
break;
}
case 9:
{
system("cls");
save(n,Class);
break;
}
default :
{
break;
}
}
}
}
int main()
{
struct Stu Class [Max];
menu(Class);
return 0;
}