#include
#include
int main()
{
struct userdata
{
char userID[10];//为了用strcmp
char userName[20];
char userSex;
int userNumber;
char userPass[20];
char userEmail[30];
char userAddress[50];
float usermoney;
};
int q;
char id[10],pass[20];
struct userdata local[20];//目前是一个二十人的数据库,后续可以改大一点
FILE *fp;
fp=fopen("userdata.txt","r+");
printf("\n\n");
printf("\t*******************************\n");
printf("\t********* 用户登录系统 *********\n");
printf("\t*******************************\n");
printf("\n\n");
printf("\t请输入用户id:");
fgets(id,10,stdin);
while(!feof(fp))
{
fscanf(fp,"%s %s %c %d %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);
printf("%s",local[q].userID);//检查一下读到的是啥
if(strcmp(id,local[q].userID)==0)
{
printf("\t请输入密码:");
fgets(pass,20,stdin);
if(strcmp(pass,local[q].userPass)==0)
{
printf("\t登陆成功");
break;
}
else
{
printf("\t密码错误,请重新尝试");
return -1;
}
}
else
{
printf("\t该用户名不存在");
return -1;
}
}
return 0;
}
输出检查的时候发现userid扫到的东西是tJ。我文件里开头写得是个一串数字,为什么会这样,应该怎么改,求帮助!
什么数字?和tJ有联系吗
fgets 会将结束符一起读取进来
fscanf 输入字符和数字需要加&
```c
include<stdio.h>
#include<string.h>
int main()
{
struct userdata
{
char userID[10];//为了用strcmp
char userName[20];
char userSex;
int userNumber;
char userPass[20];
char userEmail[30];
char userAddress[50];
float usermoney;
};
int q;
char id[10],pass[20];
struct userdata local[20];//目前是一个二十人的数据库,后续可以改大一点
FILE *fp;
fp=fopen("userdata.txt","r+");
printf("\n\n");
printf("\t*******************************\n");
printf("\t********* 用户登录系统 *********\n");
printf("\t*******************************\n");
printf("\n\n");
printf("\t请输入用户id:");
//fgets(id,10,stdin);这里会将回车一起读取给id
gets(id);
q=0;//需要初始数值 ,下面引用没有数值
while(!feof(fp))
{
fscanf(fp,"%s %s %c %d %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)); //字符和数字需要加&
printf("%s;%s;",local[q].userID,id);//检查一下读到的是啥
if(strcmp(id,local[q].userID)==0)
{
printf("\t请输入密码:");
//fgets(pass,20,stdin);里会将回车一起读取给pass
gets(pass);
if(strcmp(pass,local[q].userPass)==0)
{
printf("\t登陆成功");
break;
}
else
{
printf("\t密码错误,请重新尝试");
return -1;
}
}
else
{
printf("\t该用户名不存在");
return -1;
}
}
return 0;
}

修改完善如下,供参考:
#include <stdio.h>
#include <string.h>
struct userdata // 修改
{
char userID[10];//为了用strcmp
char userName[20];
char userSex;
int userNumber;
char userPass[20];
char userEmail[30];
char userAddress[50];
float usermoney;
};
int main()
{
int q, i;
char id[10], pass[20];
struct userdata local[20];//目前是一个二十人的数据库,后续可以改大一点
FILE* fp;
fp = fopen("userdata.txt", "r+");
if (fp == NULL) { //修改
printf("无注册用户,请先注册用户。\n");
}
else { //修改
q = 0; //修改
while (1) //!feof(fp) 修改
{
if (fscanf(fp, "%s %s %c %d %s %s %s %f\n", local[q].userID, local[q].userName, &local[q].userSex, //修改
&local[q].userNumber, local[q].userPass, local[q].userEmail, local[q].userAddress, &local[q].usermoney) != 8) break;
printf("%s\n", local[q].userID);//检查一下读到的是啥
q++; //修改
}
fclose(fp);
printf("\n\n");
printf("\t*******************************\n");
printf("\t********* 用户登录系统 *********\n");
printf("\t*******************************\n");
printf("\n\n");
printf("\t请输入用户id:");
scanf("%10[^\n]", id); //fgets(id, 10, stdin); //修改
getchar();
for (i = 0; i < q; i++) { //修改
if (strcmp(id, local[i].userID) == 0)
break;
}
if (i >= q) { //修改
printf("\t用户ID:%s不存在!\n", id);
return -1;
}
else{ //修改
q = 0;
do {
printf("\t请输入密码:");
scanf("%20[^\n]", pass); //fgets(pass, 20, stdin);
getchar();
q++;
if (strcmp(pass, local[i].userPass) == 0)
{
printf("登陆成功!\n");
break; //调用函数
}
else
{
if (q < 3) { //修改
printf("\t密码错误,请重新尝试!\n");
}
else { //修改
printf("\t密码输入错误,3次机会已用完,退出登录!\n");
break;
}
}
} while (1);
}
}
return 0;
}
scanf(???),建议使用这个
看下这篇博客,也许你就懂了,链接:按格式化方式读取文件------fscanf函数