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

C语言开发图书馆系统:读取文本账号密码后无法验证的问题

图书馆系统登录校验功能修复

你的代码存在几个关键问题导致无法完成登录校验:

  • 变量x未初始化,直接执行array[x++]会触发数组越界,属于未定义行为
  • 未正确将读取到的用户名与密码配对,也未和用户输入的内容做有效性对比
  • strtok的使用逻辑混乱,注释掉的代码还存在语法错误(比如strtok参数个数不符合要求)

以下是修复后的完整代码,保留了你的核心逻辑并修正问题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  // 必须包含strcmp和strtok所需的头文件

int GirisYap() {
    char k_adi[25];
    char sifre[25];
    
    printf("Kullanici adinizi giriniz : ");
    scanf("%s", k_adi);
    printf("Sifrenizi giriniz : ");
    scanf("%s", sifre);

    FILE* fFile = fopen("hesaplardatabase.txt", "r");
    if (fFile == NULL) {
        printf("Böyle bir dosya bulunamadı.");
        return 0;
    }

    char sBuffer[256];
    // 逐行读取文件,假设每行格式为「用户名-密码」
    while (fgets(sBuffer, sizeof(sBuffer), fFile) != NULL) {
        // 去掉换行符,避免干扰字符串对比
        sBuffer[strcspn(sBuffer, "\n")] = '\0';
        
        // 分割当前行的用户名和密码
        char* username = strtok(sBuffer, "-");
        char* password = strtok(NULL, "-");
        
        // 检查分割是否成功,同时对比输入内容
        if (username != NULL && password != NULL) {
            if (strcmp(username, k_adi) == 0 && strcmp(password, sifre) == 0) {
                printf("\n\nSifreniz dogru.\nBasariyla giris yapildi\nLutfen Bekleyiniz...");
                fclose(fFile);
                return 1;
            }
        }
    }

    // 循环结束未找到匹配项
    printf("\nKullanici adi veya sifre hatali!");
    fclose(fFile);
    return 0;
}

关键修复点说明:

  • 补充了<string.h>头文件,strcmp和strtok函数依赖该头文件
  • 采用逐行读取+逐行校验的方式,无需存储所有用户数据,节省内存同时逻辑更清晰
  • 用strcspn去除fgets读取到的换行符,避免因为多余换行符导致匹配失败
  • 修复了未初始化变量的问题,避免未定义行为

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:50:56