fscanf扫文件时扫到的东西不对

fscanf扫文件时扫到的东西不对
#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;

}



![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/869539303166165.png "#left")

修改完善如下,供参考:

#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;
}

img

scanf(???),建议使用这个

看下这篇博客,也许你就懂了,链接:按格式化方式读取文件------fscanf函数
同时,你还可以查看手册:c语言-fscanf() 中的内容