C语言读取文件内容存入变量并完成值比对的实现方法
可直接实现文件读取+登录比对的完整方案
你现有代码的核心问题点
- 错误重定义标准fgets:C语言不允许在main函数内部嵌套定义自定义函数,而且你改写的fgets根本没有实际读文件的操作,只是直接返回传入的参数,完全达不到从文件读内容的目的
- 字符串不能直接用相等符号比对:C语言中数组名代表的是数组的首地址,直接写
email == emailx比对的是两个内存地址,永远不可能相等,这也是你代码跑不起来的核心原因之一 - 输入读取逻辑错误:
scanf("%c", &email)中%c是用来读取单个字符的,email本身是字符数组(首地址),传参类型不匹配会造成内存非法访问 - 变量作用域错误:你定义的
emailx是写在那个无效的嵌套函数内部的局部变量,main函数的循环逻辑里根本访问不到这个变量,所以才会报“emailx未声明”的编译错误 - 缺少文件打开错误判断:如果txt文件路径不对、被占用,fopen会返回空指针,这时候直接操作文件会直接导致程序崩溃
可直接运行的完整实现
准备工作
在你存放C语言代码的同目录下,新建两个纯文本文件:
admin_email.txt:内部直接写入预设的管理员邮箱(比如admin@school.com),写完不要多按多余的回车admin_pwd.txt:内部直接写入预设的管理员密码(比如admin2024),同样不要留多余空行
核心代码
#include <stdio.h> #include <string.h> #define MAX_EMAIL_LEN 30 #define MAX_PWD_LEN 16 int main() { // 打开存了预设账号信息的文件 FILE *email_file = fopen("admin_email.txt", "r"); FILE *pwd_file = fopen("admin_pwd.txt", "r"); // 检查文件是否正常打开 if(email_file == NULL || pwd_file == NULL) { printf("预设账号文件缺失,请检查同目录下的txt文件\n"); return 1; } // 定义变量存储从文件读出来的预设账号信息 char stored_email[MAX_EMAIL_LEN] = {0}; char stored_pwd[MAX_PWD_LEN] = {0}; fgets(stored_email, MAX_EMAIL_LEN, email_file); fgets(stored_pwd, MAX_PWD_LEN, pwd_file); fclose(email_file); fclose(pwd_file); // 去掉fgets自动读入的末尾换行符,避免比对失败 int e_len = strlen(stored_email); if(e_len > 0 && stored_email[e_len-1] == '\n') { stored_email[e_len-1] = '\0'; } int p_len = strlen(stored_pwd); if(p_len > 0 && stored_pwd[p_len-1] == '\n') { stored_pwd[p_len-1] = '\0'; } // 循环等待用户输入,直到输入信息和文件存储的内容完全匹配 char input_email[MAX_EMAIL_LEN] = {0}; char input_pwd[MAX_PWD_LEN] = {0}; do { printf("请输入管理员邮箱:"); scanf("%29s", input_email); // 清空输入缓冲区残留内容,避免下次读取出错 while(getchar() != '\n'); printf("请输入管理员密码:"); scanf("%15s", input_pwd); while(getchar() != '\n'); // 用strcmp做字符串相等比对,返回0代表两个字符串完全一致 if(strcmp(input_email, stored_email) == 0 && strcmp(input_pwd, stored_pwd) == 0) { printf("登录成功!\n"); break; } else { printf("邮箱或密码错误,请重新输入\n"); } } while(1); return 0; }
作业核心逻辑说明
- 从文件读内容的逻辑:直接调用C语言标准库的
fgets(存储变量, 变量最大长度, 文件指针)即可,不需要自己编写读文件的函数,就能把txt里的字符内容读到定义好的数组变量里 - 字符串比对的逻辑:必须引入
string.h头文件,通过strcmp()函数完成两个字符串的相等判断,绝对不能直接用==/!=比对数组名 - 常见隐形bug规避:用记事本存txt文件时,敲完内容的回车会被fgets一起读入变量,需要手动把末尾的换行符替换成字符串结束符,否则哪怕输入内容完全正确,也会因为多了个换行符导致比对失败
内容的提问来源于stack exchange,提问作者0m3rk4
相关产品推荐
相关产品推荐

