登入与注册总是用户密码错误,如何解决?(语言-c语言)


#include <stdio.h>
#include <stdlib.h>

struct sysuser {
    char username[20];
    char password[20];
} newuser, olduser;

void registerUser() {
    FILE *file;

    printf("请输入用户名: \n");
    scanf("%s", newuser.username);

    printf("请输入密码:\n");
    scanf("%s", newuser.password);

    file = fopen("user.txt", "a+");

    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }

    while (fscanf(file, "%s %s\n", olduser.username, olduser.password) != EOF) {
        if (strcmp(olduser.username, newuser.username) == 0) {
            printf("用户名已存在\n");
            fclose(file);
            return ;
        }
    }

    fprintf(file, "%s %s\n", newuser.username, newuser.password);
    fclose(file);

    printf("注册成功!\n");
}

int loginUser() {
    char username[20], password[20];
    FILE *file;

    printf("请输入用户名:");
    scanf_s("%s", &username);
    printf("请输入密码:");
    scanf("%s", &password);
    file = fopen("user.txt", "r");

    if (file == NULL) {
        printf("无法打开文件\n");
        return 0;
    }

    while (fscanf_s(file, "%s %s\n", olduser.username,20, olduser.password,20) != EOF) {
        if (strcmp(olduser.username, username) == 0 && strcmp(olduser.password, password) == 0) {
            printf("登录成功!\n");
            fclose(file);
            return 1;
        }
    }

    printf("用户名或密码错误\n");
    fclose(file);
    return 0;
}

int main() {
    int choice;

    while (1) {
        printf("欢迎使用系统\n");
        printf("请选择操作:\n");
        printf("1. 注册\n");
        printf("2. 登录\n");
        printf("3. 退出\n");

        scanf("%d", &choice);
        getchar();  

        switch (choice) {
            case 1:
                registerUser();
                break;
            case 2:
                if (loginUser()) 
                /*int operation;
                 printf("登录成功!请选择你要解决的问题类别:\n");
                 printf("1. 素数类\n");
                 printf("2. 解方程类\n");
                 printf("3. 数列类\n");
                 printf("4. 排序类\n");
                 printf("5. 完数因子\n");
                 printf("6. 趣味问题\n");
                 scanf("%d", &operation);
                switch (operation) {
                  case 1:
                  
                         break;
                  case 2:
            
                         break;
                  case 3:
                  
                         break; 
                  default:
                         printf("无效选项,请重新选择\n");
                         break;
                                   }*/
                    
                                
                break;
            case 3:
                printf("退出登录!\n");
                return 0;
            default:
                printf("无效选项,请重新选择\n");
                break;
        }
    }

    return 0;
}

你这里结构体的使用有问题哦,newuser现在是结构体类型,不是参数,不能直接用。需要用结构体类型定义结构体参数的!

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7415189
  • 你也可以参考下这篇文章:对一串整数序列排序,左边为奇数,右边为偶数---C语言
  • 同时,你还可以查看手册:c语言-关键词 中的内容
  • 除此之外, 这篇博客: 指针强化练习,让你彻底征服指针【c语言】中的 字符指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 	char* p = "abcdef";
    	printf("%d\n", sizeof(p)); //1
    	printf("%d\n", sizeof(p + 1)); //2
    	printf("%d\n", sizeof(*p)); //3
    	printf("%d\n", sizeof(p[0])); //4
    	printf("%d\n", sizeof(&p));  //5
    	printf("%d\n", sizeof(&p + 1)); //6
    	printf("%d\n", sizeof(&p[0] + 1));  //7
    
    	printf("%d\n", strlen(p));  //8
    	printf("%d\n", strlen(p + 1));// 9
    	printf("%d\n", strlen(*p)); //10
    	printf("%d\n", strlen(p[0]));  //11
    	printf("%d\n", strlen(&p)); //12
    	printf("%d\n", strlen(&p + 1));  //13
    	printf("%d\n", strlen(&p[0] + 1));  //14
    

    1 p指向的是a的地址 ,sizeof§,计算的是一个指针变量的大小 ,虽然是字符指针,也是指针 ,指针的大小是4/8
    在这里插入图片描述


    2 sizeof(p+1) p+1 指向b的地址 ,b的地址也是地址 ,所以是4/8
    在这里插入图片描述


    3 sizeof(*p) ,p指向a的地址, *p 拿到的是a元素
    在这里插入图片描述


    4 p[0] 等价于*( p+0) ,找到的就是a元素
    在这里插入图片描述


    5 &p ,取出p的地址 ,p的地址也是地址 , 所以结果是4/8
    在这里插入图片描述


    6 &p +1 ,跳过一个p ,所以结果是4/8
    在这里插入图片描述


    7 &p[0]+1 p[0] 是a元素 , &p[0] 就是取出a的地址 ,+1 指向b的地址,b的地址也是地址 , 所以结果是4/8
    在这里插入图片描述


    8 p指向a的地址 ,strlen 向后寻找\0 才会停止 ,所以结果是6
    在这里插入图片描述


    9 p指向a的地址 ,p+1 就指向b的地址 ,所以结果是5
    在这里插入图片描述


    10 *p 找到的是a ,代码错误
    在这里插入图片描述


    11 p[0] 就等价于*(p+0) ,找到a元素 ,代码错误
    在这里插入图片描述


    12 &p ,取出p指针的地址 ,但是里面是否有\0 , strlen 并不清楚 ,所以是随机值
    在这里插入图片描述


    13 &p+1 结果是随机值
    在这里插入图片描述


    14 &p[0]+1 ,指向b的地址 ,所以结果是5
    在这里插入图片描述


  • 您还可以看一下 王伟老师的C语言入门到精通课程中的 函数指针小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    这里提供一些可能导致登入与注册功能出现用户密码错误的情况的原因和解决方法:

    1. 密码输入错误 如果输入的密码与数据库中存储的密码不相等,就会出现用户密码错误的情况。可以在代码中添加输入密码和数据库中密码的判断,如果不相等,就提示密码错误。

    2. 数据库存储错误 如果数据库中存储的密码与原始密码不匹配,也会出现用户密码错误的情况。可以检查数据库中的密码是否正确,并尝试重新存储正确的密码。

    3. 密码加密问题 在数据库中存储的用户密码应该是加密后的密码。如果没有对密码进行加密,也会出现密码错误的情况。可以使用加密算法对密码进行加密,以确保存储的密码安全。

    针对以上可能出现的问题,可以参考以下解决方法:

    1. 密码输入错误 (1)添加输入密码和数据库中密码的判断:
    if(strcmp(password, user.password) != 0) {
        printf("Password is incorrect! Please try again!\n");
        continue;
    }
    

    这里使用strcmp函数来比较输入的密码和数据库中密码是否相等,如果不相等,就提示密码错误并重新输入密码。

    1. 数据库存储错误 (1)检查数据库中的密码是否正确; (2)尝试重新存储正确的密码。

    2. 密码加密问题 (1)使用加密算法对密码进行加密; (2)检查加密算法是否正确,确保存储的密码是正确的加密后的密码,而不是明文密码。

    对于密码加密问题,常用的加密算法有MD5、SHA等,可以使用这些算法对密码进行加密。关于具体的加密方法和代码实现,可以参考相关资料和库函数的使用。

第45行: scanf_s("%s", &username); 参数前面多了'&'符,修改为: scanf("%s", username);
第47行: scanf("%s", &password); 同样参数前面多了'&符,修改为:scanf("%s", password);
其它没什么问题,修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>

struct sysuser {
    char username[20];
    char password[20];
} newuser, olduser;

void registerUser() {
    FILE *file;

    printf("请输入用户名: \n");
    scanf("%s", newuser.username);

    printf("请输入密码:\n");
    scanf("%s", newuser.password);

    file = fopen("user.txt", "a+");

    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }

    while (fscanf(file, "%s %s\n", olduser.username, olduser.password) != EOF) {
        if (strcmp(olduser.username, newuser.username) == 0) {
            printf("用户名已存在\n");
            fclose(file);
            return ;
        }
    }

    fprintf(file, "%s %s\n", newuser.username, newuser.password);
    fclose(file);

    printf("注册成功!\n");
}

int loginUser() {
    char username[20], password[20];
    FILE *file;

    printf("请输入用户名:");
    scanf("%s", username); //scanf_s("%s", &username); 修改
    printf("请输入密码:");
    scanf("%s", password); //scanf("%s", &password);   修改
    file = fopen("user.txt", "r");
 
    if (file == NULL) {
        printf("无法打开文件\n");
        return 0;
    }
 
    while (fscanf(file, "%s %s\n", olduser.username, olduser.password) != EOF) {
        // fscanf_s(file, "%s %s\n", olduser.username,20, olduser.password,20) != EOF
        if (strcmp(olduser.username, username) == 0 && strcmp(olduser.password, password) == 0) {
            printf("登录成功!\n");
            fclose(file);
            return 1;
        }
    }

    printf("用户名或密码错误\n");
    fclose(file);
    return 0;
}

int main() {
    int choice;

    while (1) {
        printf("欢迎使用系统\n");
        printf("请选择操作:\n");
        printf("1. 注册\n");
        printf("2. 登录\n");
        printf("3. 退出\n");

        scanf("%d", &choice);
        getchar();

        switch (choice) {
            case 1:
                registerUser();
                break;
            case 2:
                if (loginUser())
                   //int operation;
                 printf("登录成功!请选择你要解决的问题类别:\n");

                 /*printf("1. 素数类\n");
                 printf("2. 解方程类\n");
                 printf("3. 数列类\n");
                 printf("4. 排序类\n");
                 printf("5. 完数因子\n");
                 printf("6. 趣味问题\n");
                 scanf("%d", &operation);
                switch (operation) {
                  case 1:
                  
                         break;
                  case 2:

                         break;
                  case 3:
                  
                         break;
                  default:
                         printf("无效选项,请重新选择\n");
                         break;
                                   }*/
                    
                                
                break;
            case 3:
                printf("退出登录!\n");
                return 0;
            default:
                printf("无效选项,请重新选择\n");
                break;
        }
    }
    return 0;
}