You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现基于文件比对的登录系统相关问题求助

核心错误原因
  • fscanf返回值判断错误:你新增第二个%s格式符后,fscanf成功读取两个字段时会返回2,原判断条件==1永远不成立,循环不会执行,比对自然失效
  • 输入内容带多余换行符:fgets读取用户输入时会把末尾的\n也存入字符串,而fscanf的%s会自动跳过空白符,导致两边字符串strcmp永远匹配失败
  • 变量赋值逻辑错误:匹配分支中valid == 0是相等判断而非赋值,且逻辑反向:初始valid=0代表未匹配,匹配成功应该设为valid=1,最后判断valid==0才是未找到记录
  • 语法规范问题:标准C中main函数返回值应为int,而非void
修复后可正常运行的代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 


struct CustomerDetails  // Structure declaration
{
    char fname[100];
    char pass[100];
}s;


int main()
{
    FILE* login;
    login = fopen("login.txt", "r");
    char fname[100],pass[100];
    int valid = 0;

    // validate whether file can be opened.
    if (login == NULL)
    {
        printf("Could not open file");
        exit(0);
    }

    printf("Please enter your Full Name and Password to search your booking detail.\n");
    printf("\nFull Name: ");
    fgets(fname, 100, stdin);
    // 去掉fgets读取的末尾换行符
    fname[strcspn(fname, "\n")] = '\0';
    printf("Password: ");
    fgets(pass, 100, stdin);
    pass[strcspn(pass, "\n")] = '\0';
    // 修改返回值判断为2
    while (fscanf(login,"%s %s",s.fname,s.pass) == 2)
    {
        if (strcmp(fname,s.fname) == 0 && strcmp(pass, s.pass) == 0)
        {
            // 修正赋值逻辑
            valid = 1;
            printf("\nRecord Found!");
            printf("\nFull Name: %s\n", s.fname);
            printf("\nPassword: %s\n", s.pass);
            break;
        }
    }
    // 修正判断逻辑
    if (valid == 0)
    {
        printf("\nRecord not found!\n");
    }
    fclose(login);
    return 0;
}
其他实现方案
  • 更稳定的比对方案:优先用fgets逐行读取文件内容,再用sscanf拆分每行的姓名字段和密码字段,避免fscanf遇到格式错乱的行时整个文件读取偏移异常,也方便打印整行原始内容
  • 仅比对行首、行尾字符串的实现方法:如果每行有多个字段,先用strtok按空白符拆分当前行的字符串,第一个拆分得到的token就是行首字符串,循环调用strtok直到返回NULL,最后一次非NULL的结果就是行尾字符串,分别和输入内容比对即可

内容的提问来源于stack exchange,提问作者user16437182

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 11:51:02