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
相关产品推荐
相关产品推荐

